diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-16 06:23:13 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-16 06:23:13 +0000 |
commit | 8759a126a1bb9eec550c37b5b14642b0cfeb797b (patch) | |
tree | bc4744f903d38710e61a9e8ca6766132e5926201 /sca-cpp/branches/cpp-M1/sdo/runtime | |
parent | fd1aa20dd751f242e2df5ee61c84dfbd7c0ebb83 (diff) |
Cleaning up SVN structure, moving branch under sca-cpp/branches.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@880612 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/branches/cpp-M1/sdo/runtime')
417 files changed, 62300 insertions, 0 deletions
diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/Makefile.am new file mode 100644 index 0000000000..527708855b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = core diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/Makefile.am new file mode 100644 index 0000000000..1b3ddb9c93 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src test sdo_axiom sdo_axiom_test diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/Makefile.am new file mode 100644 index 0000000000..7339b49e97 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/Makefile.am @@ -0,0 +1,22 @@ +SUBDIRS = + +nobase_include_HEADERS = sdo_axiom.h \ +sdo_axiom_export.h + +lib_LTLIBRARIES = libtuscany_sdo_axiom.la +AM_CPPFLAGS = $(CPPFLAGS) + +libtuscany_sdo_axiom_la_SOURCES = \ + sdo_axiom.cpp + +libtuscany_sdo_axiom_la_LIBADD = \ + -L$(top_builddir)/runtime/core/src/commonj/sdo -ltuscany_sdo \ + -L$(AXIS2C_HOME)/lib \ + -laxis2_util \ + -laxis2_axiom \ + -laxis2_parser + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I$(top_builddir)/runtime/core/sdo_axiom \ + -I${AXIS2C_HOME}/include +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom.cpp new file mode 100644 index 0000000000..0d71d9802e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom.cpp @@ -0,0 +1,264 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "sdo_axiom.h" + +using namespace commonj::sdo; +using namespace std; + + +namespace commonj +{ + namespace sdo_axiom + { + + int AxiomHelper::axiswritercount = 0; + + AxiomHelper* AxiomHelper::getHelper() + { + return new AxiomHelper(); + } + + void AxiomHelper::releaseHelper(AxiomHelper* h) + { + if (h) delete h; + } + + void AxiomHelper::deleteEnv() + { + if (the_env)axis2_env_free(the_env); + } + + void AxiomHelper::createEnv() + { + + the_allocator = axis2_allocator_init (NULL); + if (the_allocator == NULL) return; + + the_env = axis2_env_create(the_allocator); + + if (the_env == 0) return; + + return; + } + + + AxiomHelper::AxiomHelper() + { + createEnv(); + } + + AxiomHelper::~AxiomHelper() + { + deleteEnv(); + } + + + axis2_env_t* AxiomHelper::getEnv() + { + return the_env; + } + + axiom_node_t* AxiomHelper::toAxiomNode(DataObjectPtr dob) + { + + axiom_document_t* doc = toAxiomDoc(dob); + + if (!doc) + { + return 0; + } + + axiom_node_t* root_node = + AXIOM_DOCUMENT_GET_ROOT_ELEMENT(doc, the_env); + if (!root_node) + { + cout << "No Root Element in the document" << endl; + return 0; + } + + + return root_node; + } + + axiom_document_t* AxiomHelper::toAxiomDoc(DataObjectPtr dob) + { + + DataFactory* df = dob->getDataFactory(); + XSDHelperPtr xs = HelperProvider::getXSDHelper(df); + XMLHelperPtr xm = HelperProvider::getXMLHelper(df); + if (!the_env) + { + cout << "No Axis Environment" << endl; + return 0; + } + char * str = + xm->save( + dob, + dob->getType().getURI(), + dob->getType().getName()); + + // if (str) cout << str << endl; + + axiom_xml_reader_t * reader = + axiom_xml_reader_create_for_memory(the_env, + (void*)str, + strlen(str), + (const axis2_char_t *)"UTF-8", + AXIS2_XML_PARSER_TYPE_BUFFER); + + if (!reader) + { + cout << "No Axis Reader" << endl; + return 0; + } + + axiom_stax_builder_t* builder = + axiom_stax_builder_create(the_env, reader); + + if (!builder) + { + cout << "No Axis Builder" << endl; + AXIOM_XML_READER_FREE(reader, the_env); + return 0; + } + + axiom_document_t* document = + AXIOM_STAX_BUILDER_GET_DOCUMENT(builder, the_env); + + if (!document) + { + cout << "No Axis Document" << endl; + AXIOM_STAX_BUILDER_FREE(builder, the_env); + return 0; + } + + axiom_node_t* root_node = + AXIOM_DOCUMENT_GET_ROOT_ELEMENT(document, the_env); + if (!root_node) + { + cout << "No Root Element in the document" << endl; + AXIOM_STAX_BUILDER_FREE(builder, the_env); + return 0; + } + + + AXIOM_DOCUMENT_BUILD_ALL(document, the_env); + + return document; + } + + DataObjectPtr AxiomHelper::toSdo(axiom_document_t* document, + DataFactoryPtr factory) + { + + if (!the_env) + { + cout << "No Axis Environment" << endl; + return 0; + } + + axiom_node_t* root_node = + AXIOM_DOCUMENT_GET_ROOT_ELEMENT(document, the_env); + + return toSdo(root_node,factory); + } + + DataObjectPtr AxiomHelper::toSdo(axiom_node_t* root_node, + DataFactoryPtr factory) + { + + if (!the_env) + { + cout << "No Axis Environment" << endl; + return 0; + } + + XMLHelperPtr helper = HelperProvider::getXMLHelper(factory); + + axiom_xml_writer_t* writer = axiom_xml_writer_create_for_memory( + the_env, NULL, AXIS2_TRUE, 0, + AXIS2_XML_PARSER_TYPE_BUFFER); + + axiom_output_t* output = axiom_output_create(the_env, writer); + + + if (!root_node) + { + cout << "No Root Element in the document" << endl; + AXIOM_OUTPUT_FREE(output, the_env); + return 0; + } + + AXIOM_NODE_SERIALIZE(root_node, the_env, output); + + axis2_char_t* buffer = (axis2_char_t*)AXIOM_XML_WRITER_GET_XML(writer, the_env); + + XMLDocumentPtr theXMLDocument = helper->load(buffer); + + if (theXMLDocument != 0) + { + return theXMLDocument->getRootDataObject(); + } + cout << "The XML document returned from load was zero" << endl; + return 0; + } + + void AxiomHelper::output(axiom_document_t* document) + { + + if (!the_env) + { + cout << "No Axis Environment" << endl; + return; + } + + axiom_xml_writer_t* writer = axiom_xml_writer_create_for_memory( + the_env, NULL, AXIS2_TRUE, 0, + AXIS2_XML_PARSER_TYPE_BUFFER); + + axiom_output_t* output = axiom_output_create(the_env, writer); + + axiom_node_t* root_node = + AXIOM_DOCUMENT_GET_ROOT_ELEMENT(document, the_env); + + if (!root_node) + { + cout << "No Root Element in the document" << endl; + AXIOM_OUTPUT_FREE(output, the_env); + return; + } + + AXIOM_NODE_SERIALIZE(root_node, the_env, output); + + axis2_char_t* buffer = (axis2_char_t*)AXIOM_XML_WRITER_GET_XML(writer, the_env); + + printf("Output XML:n %s ", buffer); + + AXIOM_OUTPUT_FREE(output, the_env); + + return; + } + } +} + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom.h new file mode 100644 index 0000000000..631c1c9437 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom.h @@ -0,0 +1,85 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#ifndef _SDO_AXIOM_H_ +#define _SDO_AXIOM_H_ + +#include "sdo_axiom_export.h" + +#include "axiom.h" +//#include "axis2_om_document.h" +//#include "axis2_om_stax_builder.h" + + +#include "commonj/sdo/SDO.h" + +using namespace commonj::sdo; + +namespace commonj +{ + namespace sdo_axiom + { + +/** + * AxiomHelper writes a data object tree to XML + */ + class AxiomHelper + { + + public: + + SDO_AXIOM_API AxiomHelper(); + + SDO_AXIOM_API virtual ~AxiomHelper(); + + SDO_AXIOM_API static AxiomHelper* getHelper(); + + SDO_AXIOM_API static void releaseHelper(AxiomHelper* ax); + + SDO_AXIOM_API axiom_document_t* toAxiomDoc(DataObjectPtr dob); + SDO_AXIOM_API axiom_node_t* toAxiomNode(DataObjectPtr dob); + + SDO_AXIOM_API DataObjectPtr toSdo(axiom_document_t* doc,DataFactoryPtr factory); + SDO_AXIOM_API DataObjectPtr toSdo(axiom_node_t* root_node,DataFactoryPtr factory); + + SDO_AXIOM_API axis2_env_t* getEnv(); + + SDO_AXIOM_API void output(axiom_document_t* document); + + + protected: + private: + + void deleteEnv(); + + void createEnv(); + + static int axiswritercount; + + axis2_env_t *the_env; + axis2_allocator_t *the_allocator; + + + + }; + } // End - namespace sdo_axiom +} // End - namespace commonj + + +#endif //_SDO_AXIOM_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom_export.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom_export.h new file mode 100644 index 0000000000..70d6b813f7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom/sdo_axiom_export.h @@ -0,0 +1,37 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + + +#ifdef WIN32 + +#ifdef SDO_AXIOM_EXPORTS +# define SDO_AXIOM_API __declspec(dllexport) +# define SDO_AXIOM_EXPIMP +#else +# define SDO_AXIOM_API __declspec(dllimport) +# define SDO_AXIOM_EXPIMP extern +#endif + +#else + +# define SDO_AXIOM_API +# define SDO_AXIOM_EXPIMP + +#endif + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/Makefile.am new file mode 100644 index 0000000000..69acb6e9da --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/Makefile.am @@ -0,0 +1,23 @@ +prgbindir=$(prefix)/bin/test +prgbin_PROGRAMS = tuscany_sdo_axiom_test +SUBDIRS = +AM_CPPFLAGS = $(CPPFLAGS) +tuscany_sdo_axiom_test_SOURCES = sdo_axiom_test.cpp + +noinst_HEADERS=*.h + +tuscany_sdo_axiom_test_LDADD = \ + -L$(top_builddir)/runtime/core/src/commonj/sdo -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/sdo_axiom -ltuscany_sdo_axiom \ + -L${LIBXML2_LIB} -lxml2 \ + -L$(AXIS2C_HOME)/lib \ + -laxis2_util \ + -laxis2_axiom \ + -laxis2_parser \ + -laxis2_minizip + +INCLUDES = -I$(top_builddir)/runtime/core/sdo_axiom_test \ + -I$(top_builddir)/runtime/core/src \ + -I$(top_builddir)/runtime/core/sdo_axiom \ + -I${AXIS2C_HOME}/include +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/sdo_axiom_test.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/sdo_axiom_test.cpp new file mode 100644 index 0000000000..31d4e2b029 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/sdo_axiom_test.cpp @@ -0,0 +1,132 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: main.cpp,v 1.1 2006/03/16 10:54:16 slattery Exp $ */ + +#include <stdio.h> + +#pragma warning(disable:4786) + +#include <iostream> + +#include "sdo_axiom_test.h" + + +void axiomtest::axiom_test() +{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Company"); + + mdg->addType("myspace","Department"); + + mdg->addType("myspace","Employee"); + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","norbert", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","departments", + "myspace","Department", true, false, true); + + mdg->addPropertyToType("myspace","Department","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Department","employees", + "myspace","Employee", true, false, true); + + mdg->addPropertyToType("myspace","Employee","name", + "commonj.sdo","String", false, false, false); + + const Type& tcc = mdg->getType("myspace","Company"); + + DataObjectPtr company = mdg->create((Type&)tcc); + company->setCString("name","The VDB Company Inc"); + company->setCString("norbert","Spandex Courvette"); + + + DataObjectPtr dept1 = company->createDataObject("departments"); + dept1->setCString("name","Accounts"); + + DataObjectPtr dept2 = company->createDataObject("departments"); + dept2->setCString("name","Billing"); + + DataObjectPtr emp1 = dept1->createDataObject("employees"); + emp1->setCString("name","Albert"); + + DataObjectPtr emp2 = dept1->createDataObject("employees"); + emp2->setCString("name","Ben"); + + DataObjectPtr emp3 = dept2->createDataObject("employees"); + emp3->setCString("name","Cyril"); + + DataObjectPtr emp4 = dept2->createDataObject("employees"); + emp4->setCString("name","Dominic"); + + AxiomHelper* ax = AxiomHelper::getHelper(); + + if (ax) + { + axiom_document_t* doc = ax->toAxiomDoc(company); + + if (doc) + { + ax->output(doc); + + DataObjectPtr newdob = ax->toSdo(doc,mdg); + + if (newdob) + { + cout << "Printing first data object..." << endl; + SDOUtils::printDataObject(cout,newdob); + cout << "Finished" << endl; + } + + axiom_node_t* node = + AXIOM_DOCUMENT_GET_ROOT_ELEMENT(doc, ax->getEnv()); + + + DataObjectPtr newdob2 = ax->toSdo(node,mdg); + + if (newdob2) + { + cout << "Printing second data object..." << endl; + SDOUtils::printDataObject(cout,newdob2); + cout << "Finished" << endl; + } + + + } + + } + + return; + +} + +extern "C"{ + +int main (int argc, char** argv) +{ + axiomtest::axiom_test(); + return 0; +} + +} diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/sdo_axiom_test.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/sdo_axiom_test.h new file mode 100644 index 0000000000..d4756546b7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/sdo_axiom_test/sdo_axiom_test.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: sdotest.h,v 1.21 2006/03/16 12:21:04 slattery Exp $ */ + +#include "sdo_axiom.h" +#include "commonj/sdo/SDO.h" + + +using namespace commonj::sdo; +using namespace commonj::sdo_axiom; +using namespace std; + + + +// test + +class axiomtest { + public: + + static void axiom_test(); +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.cdtbuild b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.cdtbuild new file mode 100644 index 0000000000..7c9117ffae --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.cdtbuild @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?fileVersion 3.0.0?> + +<ManagedProjectBuildInfo> +<project id="tuscany_sdo.cdt.managedbuild.target.gnu.so.1649887895" name="Shared Library (Gnu)" projectType="cdt.managedbuild.target.gnu.so"> +<configuration artifactExtension="so" artifactName="tuscany_sdo" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="cdt.managedbuild.config.gnu.so.debug.804736841" name="Debug" parent="cdt.managedbuild.config.gnu.so.debug"> +<toolChain id="cdt.managedbuild.toolchain.gnu.so.debug.853581152" name="GCC Tool Chain" superClass="cdt.managedbuild.toolchain.gnu.so.debug"> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.compiler.so.debug.1430134894" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.so.debug"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.compiler.so.debug.1021362517" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.so.debug"> +<option id="gnu.cpp.compiler.option.preprocessor.def.2069673202" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols"> +<listOptionValue builtIn="false" value="_DEBUG"/> +</option> +<option id="gnu.cpp.compiler.option.include.paths.1923756814" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value="${project_loc}"/> +<listOptionValue builtIn="false" value="${LIBXML2_INCLUDE}"/> +</option> +<option id="gnu.cpp.compiler.option.warnings.allwarn.1941506556" superClass="gnu.cpp.compiler.option.warnings.allwarn" value="false" valueType="boolean"/> +</tool> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.linker.so.debug.1367539588" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.so.debug"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.linker.so.debug.2094383123" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.so.debug"/> +<tool command="as" id="cdt.managedbuild.tool.gnu.assembler.so.debug.662724583" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.so.debug"/> +<macros/> +</toolChain> +</configuration> +<configuration artifactExtension="so" artifactName="tuscany_sdo" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="cdt.managedbuild.config.gnu.so.release.1588435275" name="Release" parent="cdt.managedbuild.config.gnu.so.release"> +<toolChain id="cdt.managedbuild.toolchain.gnu.so.release.1916451262" name="GCC Tool Chain" superClass="cdt.managedbuild.toolchain.gnu.so.release"> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.compiler.so.release.994589200" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.so.release"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.compiler.so.release.1429553177" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.so.release"> +<option id="gnu.cpp.compiler.option.include.paths.1557660473" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value="${project_loc}"/> +<listOptionValue builtIn="false" value="/usr/include/libxml2"/> +</option> +<option id="gnu.cpp.compiler.option.warnings.allwarn.687619026" superClass="gnu.cpp.compiler.option.warnings.allwarn" value="false" valueType="boolean"/> +</tool> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.linker.so.release.316500641" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.so.release"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.linker.so.release.1432920590" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.so.release"/> +<tool command="as" id="cdt.managedbuild.tool.gnu.assembler.so.release.1095309957" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.so.release"/> +<macros/> +</toolChain> +</configuration> +<macros/> +</project> +</ManagedProjectBuildInfo> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.cdtproject b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.cdtproject new file mode 100644 index 0000000000..48a12e6664 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.cdtproject @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.managedbuilder.core.managedMake">
+<extension id="org.eclipse.cdt.managedbuilder.core.ManagedBuildManager" point="org.eclipse.cdt.core.ScannerInfoProvider"/>
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<extension id="org.eclipse.cdt.core.domsourceindexer" point="org.eclipse.cdt.core.CIndexer"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.managedbuilder.MANAGED_CONTAINER"/>
+</item>
+</data>
+</cdtproject>
diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.project b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.project new file mode 100644 index 0000000000..a24e25672e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.project @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>tuscany_sdo</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.core.ccnature</nature> + </natures> +</projectDescription> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000000..37a23c6dd7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,9 @@ +#Wed Feb 15 15:54:27 GMT 2006 +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.so.debug.804736841=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="CPATH" operation\="remove"/>\n<variable name\="CPLUS_INCLUDE_PATH" operation\="remove"/>\n</environment>\n +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.so.release.1588435275=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="CPATH" operation\="remove"/>\n<variable name\="CPLUS_INCLUDE_PATH" operation\="remove"/>\n</environment>\n +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.so.debug.804736841=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="LIBRARY_PATH" operation\="remove"/>\n</environment>\n +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.so.release.1588435275=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="LIBRARY_PATH" operation\="remove"/>\n</environment>\n +environment/project=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment/>\n +environment/project/cdt.managedbuild.config.gnu.so.debug.804736841=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable delimiter\="" name\="LIBXML2_INCLUDE" operation\="replace" value\="/usr/include/libxml2"/>\n</environment>\n +environment/project/cdt.managedbuild.config.gnu.so.release.1588435275=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable delimiter\="" name\="LIBXML2_INCLUDE" operation\="replace" value\="/usr/include/libxml2"/>\n</environment>\n diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/Makefile.am new file mode 100644 index 0000000000..b24de0f89f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = commonj + +nobase_include_HEADERS = \ +commonj/sdo/*.h
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/Makefile.am new file mode 100644 index 0000000000..82055487b0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = sdo diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummary.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummary.cpp new file mode 100644 index 0000000000..42e45603ce --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummary.cpp @@ -0,0 +1,28 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/Logger.h" + +#include "commonj/sdo/ChangeSummary.h" +namespace commonj{ +namespace sdo{ + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummary.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummary.h new file mode 100644 index 0000000000..01929ce311 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummary.h @@ -0,0 +1,207 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _CHANGESUMMARY_H_ +#define _CHANGESUMMARY_H_ +#include "commonj/sdo/export.h" + + +#include "commonj/sdo/SettingList.h" +#include "commonj/sdo/ChangedDataObjectList.h" + + +namespace commonj{ +namespace sdo { + + /** + * + * A change summary is used to record changes to the objects in a data graph. + * This allows applications to efficiently and incrementally update + * back-end storage when required. + */ + + class ChangeSummary + { + public: + + /** getChangedDataObjects() returns a list of changed objects. + * + * The new and modified objects in the list are references to objects that + * are associated with this change summary. + * The deleted objects in the list are references to copies of the objects + * as they appeared at the time that event logging was enabled; + * if the deleted objects have references to other objects, + * the references will also refer to copies of the target objects. + * Return a list of changed data objects. + */ + + virtual SDO_API ChangedDataObjectList& getChangedDataObjects() = 0; + + + /** getOldValues returns a list of old values as settings. + * + * Returns a list of Settings + * that represent the property values of the given dataObject + * at the point when logging began. + * In the case of a deleted object, + * the list will include Settings for all the properties. + * An old value Setting indicates the value at the + * point logging begins. A setting is only produced for + * modified objects if either the old value differs from the current value or + * if the isSet differs from the current value. + * No Settings are produced for created objects. + * Param dataObject the object in question. + * Return a list of settings. + */ + + virtual SDO_API SettingList& getOldValues(DataObjectPtr dataObject) = 0; + + /** getOldXpath returns the old path before the setting. + * + * Returns a path where the object was located before the setting took place. + */ + + + virtual SDO_API const char* getOldXpath(RefCountingPointer<commonj::sdo::DataObject> dol) = 0; + + /** beginLogging() sets the change summary in logging mode. + * + * The change summary is initially inactive. Setting it to logging mode + * starts the process of recording all the settings made. + */ + + virtual SDO_API void beginLogging() = 0; + + /** endLogging() stops logging. + * + * This method stops logging, but does not clear out the change summary. + * The changes are valid until the summary is next set to logging, at which time + * all old settings are lost. + */ + + virtual SDO_API void endLogging() = 0; + + + + /** isLogging() returns true if logging is enabled. + * + * Indicates whether change logging is on (true) or off (false). + */ + + virtual SDO_API bool isLogging() = 0; + + + + /** isCreated() returns true if the object was created during logging. + * + * Returns whether or not the specified data object was created while logging. + * Any object that was added to the data graph + * but was not in the data graph when logging began, + * will be considered created. + * Param dataObject the data object in question. + * Return true if the specified data object was created. + */ + + virtual SDO_API bool isCreated(DataObjectPtr dataObject) = 0; + + /** isDeleted() - true if the object was deleted during logging. + * + * Returns whether or not the specified data object was deleted while logging. + * Any object that is not contained by the data graph will be considered + * deleted. + * Param dataObject the data object in question. + * Return true if the specified data object was deleted. + */ + + virtual SDO_API bool isDeleted(DataObjectPtr dataObject) = 0; + + + /** isModified() - true if the object was changed during logging. + * + * Returns whether or not the specified data object was updated while logging. + * An object that was contained in the data graph when logging began, + * and remains in the graph when logging ends will be considered for changes. + * An object considered modified must have at least one old value Setting. + * Param dataObject the data object in question. + * Return true if the specified data object was modified. + */ + + virtual SDO_API bool isModified(DataObjectPtr dataObject) = 0; + + /** getOldValue() gets the setting showing the old value. + * + * Returns a setting for the specified property + * representing the property value of the given dataObject + * at the point when logging began. + * Returns null if the property has not changed and + * has not been deleted. + * Param dataObject the object in question. + * Param property the property of the object. + * Return the Setting for the specified property. + */ + + virtual SDO_API const Setting& getOldValue(DataObjectPtr dataObject, const Property& property) = 0; + + /** getOldContainer() gets the container before the setting. + * + * Returns the value of the container data object + * at the point when logging began. + * Param dataObject the object in question. + * Return the old container data object. + */ + + virtual SDO_API DataObjectPtr getOldContainer(DataObjectPtr dataObject) = 0; + + /** getOldContainmentProperty() - gives the property before setting. + * + * Returns the value of the containment property data object property + * at the point when logging began. + * Param dataObject the object in question. + * Return the old containment property. + */ + + virtual SDO_API const Property& getOldContainmentProperty(DataObjectPtr dataObject) = 0; + + /** undoChanges() - Not Implemented. + * + * NOT IMPLEMENTED + * + * Undoes all changes in the log to restore the tree of + * DataObjects to its original state when logging began. + * isLogging() is unchanged. The log is cleared. + */ + + virtual SDO_API void undoChanges() = 0; + + /** getOldSequence() - Not Implemented. + * + * NOT IMPLEMENTED + * + * This method gives back the sequence of a data object as it + * appeared when logging was switched on. The data object may be + * a deleted data object or a changed data object. If the + * data object was not sequenced, this returns null. + */ + + virtual SDO_API SequencePtr getOldSequence(DataObjectPtr dataObject) = 0; + +}; +}; +}; +#endif //_CHANGESUMMARY_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryBuilder.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryBuilder.cpp new file mode 100644 index 0000000000..46146d0045 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryBuilder.cpp @@ -0,0 +1,1144 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/ChangeSummaryBuilder.h" + +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/XMLQName.h" +#include "commonj/sdo/DASProperty.h" +#include "commonj/sdo/Logging.h" + +namespace commonj +{ + namespace sdo + { + +// ======================================================================== +// Constructor/Destructor +// ======================================================================== + + ChangeSummaryBuilder::ChangeSummaryBuilder( + DataFactoryPtr df, + DataObjectPtr& rootDO) + + : dataFactory(df), + rootDataObject(rootDO) + + + { + LOGINFO(INFO,"CSBuilder constructor"); + currentState = baseState; + } + + ChangeSummaryBuilder::~ChangeSummaryBuilder() + { + LOGINFO(INFO,"CSBuilder destructor"); + } + + +// ======================================================================== +// Deletion handling +// ======================================================================== + + void ChangeSummaryBuilder::populateDeletion(ChangeSummaryImpl* csi,DataObjectPtr dob, + int currentIndex) + { + LOGENTRY(INFO,"CSBuilder populateDeletion"); + try { + + std::list<deletionAttribute>::iterator attributesiter; + std::list<deletionElement>::iterator elementsiter; + + for (attributesiter= deletions[currentIndex].attributes.begin(); + attributesiter!= deletions[currentIndex].attributes.end(); + ++attributesiter) + { + + LOGINFO_1(INFO,"CSBuilder Populate deletion attribute:%s", + (const char*)((*attributesiter).name)); + + dob->setCString((const char*)((*attributesiter).name), + (const char*)((*attributesiter).value)); + } + for (elementsiter= deletions[currentIndex].elements.begin(); + elementsiter!= deletions[currentIndex].elements.end(); + ++elementsiter) + { + + LOGINFO_1(INFO,"CSBuilder:Populate deletion element:%s", + (const char*)((*elementsiter).name)); + + SDOXMLString value = (*elementsiter).value; + SDOXMLString prop = (*elementsiter).name; + + if ((*elementsiter).isDeletion) + { + for (int i = 0; i < deletions.size(); i++) + { + if (value.equals (deletions[i].reference)) + { + if (deletions[i].dob == 0) + { + handleDeletion(csi,i,dob,(*elementsiter).value, + (*elementsiter).name); + } + // dob may have been set by the line above. + if (deletions[i].dob != 0) + { + DataObjectList& dli = dob->getList(prop); + dli.insert(0,deletions[i].dob); + } + break; + } + } + } + else + { + DataObjectList& dli = dob->getList(prop); + dli.append((const char*)value); + } + } + } + catch (SDORuntimeException e) + { + LOGSDOEXCEPTION(ERROR,"Error populating a deletion record",e); + } + LOGEXIT(INFO,"CSBuilder populateDeletion"); + return; + } + + +// ======================================================================== +// Deletion handling +// ======================================================================== + + void ChangeSummaryBuilder::handleDeletion( + ChangeSummaryImpl* csi, + int currentIndex, + DataObjectPtr cont, + SDOXMLString path, + SDOXMLString prop) + { + LOGENTRY(INFO,"CSBuilder handleDeletion(2)"); + + if (deletions[currentIndex].completedprocessing) + { + LOGEXIT(INFO,"CSBuilder handleDeletion(2) - Exit1"); + return; + } + + const Property& p = cont->getProperty(prop); + DataObjectPtr dob = dataFactory->create( + p.getType()); + populateDeletion(csi,dob,currentIndex); + deletions[currentIndex].dob = dob; + deletions[currentIndex].completedprocessing=true; + csi->appendToDeletions(p,dob,cont,path); + + LOGEXIT(INFO,"CSBuilder handleDeletion(2) - Exit2"); + + return; + } + +// ======================================================================== +// Deletion handling +// ======================================================================== + + void ChangeSummaryBuilder::handleDeletion( + ChangeSummaryImpl* csi, + int currentIndex, + SDOXMLString path) + { + + // find the original container - and see if it + // still exists. + // supposing the container doesnt exist, we need + // to process the deletion of that one first, or + // locate it in the already deleted elements. + + LOGENTRY(INFO,"CSBuilder:handleDeletion"); + + if (deletions[currentIndex].completedprocessing) + { + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit1"); + return; + } + + int index = path.lastIndexOf('/'); + if (index < 0) + { + LOGERROR(WARNING,"CSBuilder logs deletion of the root object - not possible"); + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit2"); + return; + } + + SDOXMLString prop = + path.substring(index+1); + SDOXMLString contpath = + path.substring(0,index); + + index = prop.lastIndexOf('.'); + if (index >= 0) prop = prop.substring(0,index); + + index = prop.lastIndexOf('['); + if (index >= 0) prop = prop.substring(0,index); + + DataObjectPtr cont; + + if (contpath.isNull()) + { + cont = rootDataObject; + + LOGINFO_1(INFO,"Handling deletion from root of %s",(const char*)prop); + } + else + { + try { + cont = rootDataObject->getDataObject(contpath); + LOGINFO_2(INFO,"Handling deletion from %s of %s", + (const char*)contpath,(const char*)prop); + } + catch (SDORuntimeException e) + { + cont = 0; + LOGINFO(INFO,"Container was a deleted object"); + } + } + + if (cont != 0) + { + handleDeletion(csi,currentIndex,cont,path,prop); + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit3"); + return; + } + else + { + // this data object was also deleted + cont = csi->matchDeletedObject(contpath); + if (cont != 0) + { + // we found a previously deleted object for + // the container. + handleDeletion(csi,currentIndex,cont,path,prop); + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit4"); + return; + } + + } + + // it could be a deletion which has not been processed yet + for (int i = 0; i < deletions.size(); i++) + { + if (contpath.equals (deletions[i].reference)) + { + // matching deletion found + if (i == currentIndex) + { + LOGERROR(WARNING,"Loop detected in handling deletes"); + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit5"); + return; + } + // Handle the deletion first + handleDeletion(csi,i,contpath); + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit6"); + return; + } + } + LOGERROR(WARNING,"Failed to find a matching delete "); + LOGEXIT(INFO,"CSBuilder:handleDeletion - Exit7"); + return; + } + +// ======================================================================== +// Deletion handling +// ======================================================================== + + SDOXMLString ChangeSummaryBuilder::shiftedIndex(int index) + { + int pos = createDeletes[index].value.lastIndexOf('.'); + if (pos < 0) return createDeletes[index].value; + + int val = atoi((const char*)(createDeletes[index]. + value.substring(pos+1))); + + char buf[10]; + + sprintf(buf, ".%d", val + createDeletes[index].indexshift); + + return createDeletes[index].value.substring(0,pos) + buf; + } + +// ======================================================================== +// Deletion handling +// ======================================================================== + + void ChangeSummaryBuilder::shiftIndices(int index, int delta) + { + int pos = createDeletes[index].value.lastIndexOf('.'); + if (pos < 0) return; + + SDOXMLString refstring = createDeletes[index].value.substring(0,pos); + pos = atoi((const char*)(createDeletes[index].value.substring(pos+1))); + + for (int k=index+1;k<createDeletes.size();k++) + { + + if (createDeletes[k].type.equals("create")) continue; + + int pos2 = createDeletes[k].value.lastIndexOf('.'); + if (pos2 < 0) continue; + + SDOXMLString refto = createDeletes[k].value.substring(0,pos2); + pos2 = atoi((const char*)(createDeletes[k].value.substring(pos2+1))); + + if (refstring.equals(refto) && pos2 >= pos) + { + createDeletes[k].indexshift += delta; + } + } + } + +// ======================================================================== +// Rebuilding of a change summary from the lists +// ======================================================================== + + void ChangeSummaryBuilder::buildChangeSummary( + DataObjectPtr changeSummaryDO) + { + LOGENTRY(INFO,"CSBuilder:buildChangeSummary"); + + int i; + + try { + if (changeSummaryDO == 0) + { + // there is no summary data object to rebuild + LOGEXIT(INFO,"CSBuilder:buildChangeSummary Exit1"); + return; + } + ChangeSummary* cs = changeSummaryDO->getChangeSummary(); + if (cs == 0) + { + // there is no change summary - this shouldnt happen + LOGEXIT(INFO,"CSBuilder:buildChangeSummary Exit2"); + return; + } + + ChangeSummaryImpl* csi = (ChangeSummaryImpl*)cs; + + // add the creations and deletions in order + + for (i = 0; i < createDeletes.size(); i++) + { + + LOGINFO_1(INFO,"CSBuilder:create/delete:%s", + (const char*)(createDeletes[i].value)); + + SDOXMLString thispath; + + if (createDeletes[i].indexshift != 0) + { + thispath = shiftedIndex(i); + } + else + { + thispath = createDeletes[i].value; + } + + if (!createDeletes[i].type.equals("delete")) + { + DataObjectPtr dob; + if (thispath.isNull()) + { + dob = rootDataObject; + } + else + { + dob = rootDataObject->getDataObject(thispath); + } + if (dob != 0) { + + LOGINFO(INFO,"CSBuilder:add create to change summary"); + + csi->appendToCreations(dob->getContainmentProperty(), + dob, dob->getContainer()); + shiftIndices(i,-1); + } + else + { + LOGERROR_1(WARNING,"Failed to find object at %s", + (const char*)createDeletes[i].value); + } + } + else + { + // its a deletion - match it. + for (int j = 0; j < deletions.size(); j++) + { + if (deletions[j].completedprocessing)continue; + + if (thispath.equals (deletions[j].reference)) + { + // matching deletion found + LOGINFO_1(INFO,"CSBuilder:matched delete:%s", + (const char*)deletions[j].reference); + + handleDeletion(csi, j,createDeletes[i].value); + // update the path on any higher items in the current + // many-valued property. + shiftIndices(i,1); + + break; + } + } + } + } + + // add the changes + + std::list<changeAttribute>::iterator a; + std::list<changeElement>::iterator e; + + for (i = 0; i< changes.size(); i++) + { + DataObjectPtr dob; + if (changes[i].reference.isNull()) + { + dob = rootDataObject; + } + else + { + dob = rootDataObject->getDataObject(changes[i].reference); + } + if (dob != 0) + { + LOGINFO_1(INFO,"Located a change at %s", + (const char*)changes[i].reference); + + // Need to get the changelogitem, and append settings to + // it.Append attributes + + for (a=changes[i].attributes.begin(); + a != changes[i].attributes.end();++a) + { + const Property& p = dob->getProperty((const char*)((*a).name)); + if (p.getType().isDataType()) + { + csi->appendToChanges( + p,dob,(*a).value,0); + } + else + { + for (int j = 0; j < deletions.size(); j++) + { + if ((*a).value.equals (deletions[j].reference)) + { + csi->appendToChanges( + p,dob,deletions[j].dob,0); + break; + } + } + } + } + for (e=changes[i].elements.begin(); + e != changes[i].elements.end();++e) + { + const Property& p = dob->getProperty + ((const char*)((*e).name)); + if ((*e).isDeletion) + { + + LOGINFO_1(INFO,"CSBuilder Change was a deletion of:%s", + (const char*)((*e).path)); + + for (int j = 0; j < deletions.size(); j++) + { + if ((*e).path.equals (deletions[j].reference)) + { + // matching deletion found + if (deletions[j].dob != 0) + { + csi->appendToChanges( + p,dob,deletions[j].dob,(*e).index); + } + break; + } + } + } + else if ((*e).isReference) + { + LOGINFO_2(INFO,"CSBuilder:Change was a reference from:%s to %s" , + (const char*)((*e).path), + (const char*)((*e).value)); + + DataObjectPtr pdob = rootDataObject->getDataObject((*e).value); + if (pdob != 0) + { + csi->appendToChanges(p,dob,pdob,(*e).index); + } + } + else + { + LOGINFO_1(INFO,"CSBuilder:Change was a many valued item:%s" , + (const char*)((*e).name)); + + csi->appendToChanges(p,dob,(*e).value,(*e).index); + } + + } + } + else + { + LOGERROR_1(WARNING,"CSBuilder:Failed to find object at %s", + (const char*)(changes[i].reference)); + } + } + } + catch (SDORuntimeException e) + { + LOGSDOEXCEPTION(ERROR,"CSBuilder:Error rebuilding change summary",e); + } + LOGEXIT(INFO,"CSBuilder:buildChangeSummary Exit3"); + } + +// ======================================================================== +// Parsing code +// ======================================================================== + + void ChangeSummaryBuilder::processStart( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + char cbuf[32]; + int i; + + LOGENTRY(INFO,"CSBuilder:processStart"); + + if (currentState == baseState) + { + if (localname.equalsIgnoreCase("create") || + localname.equalsIgnoreCase("delete")) + { + currentState = dealingWithCreateDelete; + // will be expecting a chars message to give the + // contents + + createDeletes.insert( + createDeletes.end(),createDelete(localname)); + + LOGINFO_1(INFO,"CSBuilder: Processing a %s",(const char*)localname); + LOGEXIT(INFO,"CSBuilder:processStart Exit1"); + return; + } + else + { + // we are starting a new change record here + currentState = dealingWithChange; + + // we expect the entry to have an sdo:ref, and possibly + // some attributes for the changed single-values + SDOXMLString ref = attributes.getValue("ref"); + + if (ref.isNull()) + { + LOGERROR(INFO,"CSBuilder:Problem with change reference"); + ref = SDOXMLString("Unknown"); + } + + currentChange = change(localname, ref); + + LOGINFO_2(INFO,"CSBuilder: Processing a change:%s:%s", + (const char*)localname, + (const char*)ref); + + currentLocation.clear(); + + if (ref.equals("#/")) + { + ref = SDOXMLString("#"); + } + + currentLocation.push_back(ref); + + // clear out the change state - if there was any. + + changeIndex = 0; + previousChange = SDOXMLString(""); + + // now insert any remaining attributes of this change + + for (i=0; i < attributes.size(); i++) + { + // push all the attributes into the change record. + SDOXMLString name = attributes[i].getName(); + if (!name.equalsIgnoreCase("ref")) + { + SDOXMLString value = attributes[i].getValue(); + currentChange.addAttribute( + changeAttribute(name,value)); + } + } + } + LOGEXIT(INFO,"CSBuilder:processStart Exit2"); + return; + } + + // We are not in the base state - we could be in a change or a deletion + // We are now dropping into an element, which could be either a many-valued + // primitive type, or a placeholder in list of deletions, or a deletion + // record. + + if (currentState == dealingWithChange) + { + + if (!previousChange.equals(localname)) + { + changeIndex = 0; + previousChange = localname; + } + else + { + changeIndex++; + } + + + sprintf(cbuf,"%d",changeIndex); + currentLocation.push_back(localname + "." + cbuf); + + // build the current location... + SDOXMLString curr_loc = ""; + + if (currentLocation.size() > 0) + { + for (int pi = 0; pi < currentLocation.size()-1; pi++) + { + curr_loc = curr_loc + currentLocation[pi]; + curr_loc = curr_loc + "/"; + } + curr_loc = curr_loc + currentLocation[currentLocation.size()-1]; + } + + LOGINFO_1(INFO,"CSBuilder: Dropping into an element of a change:%s", + (const char*)localname); + LOGINFO_1(INFO,"CSBuilder:currentLocation:%s", + (const char*)curr_loc); + + // First case - its a placeholder for an element in a list + // all we have to do is keep track of the list index. + + if (attributes.size() == 1) + { + SDOXMLString name = attributes[0].getName(); + if (name.equalsIgnoreCase("ref")) + { + currentState = dealingWithChangeElement; + currentChange.addElement( + changeElement(localname, curr_loc, + attributes[0].getValue(), true, false)); + + LOGEXIT(INFO,"CSBuilder:processStart Exit3"); + return; + } + } + + if (attributes.size() == 0) + { + // It could be a many-valued primitive, or + // a deletion with no attributes + // can we match the current path to a known deletion? + + bool isDelete = false; + + for (int i = 0; i < createDeletes.size(); i++) + { + if (createDeletes[i].type.equals("delete")) + { + if (curr_loc.equals(createDeletes[i].value)) + { + LOGINFO(INFO,"CSBuilder: An existing delete was found"); + + isDelete = true; + break; // out of the for loop + } + } + } + if (!isDelete) + { + LOGINFO(INFO,"CSBuilder: Change with no atts and not deletion- an element"); + + // and will get picked up by the 'characters' method. + currentState = dealingWithChangeElement; + currentLocalName = SDOXMLString(localname); + + LOGEXIT(INFO,"CSBuilder:processStart Exit4"); + return; + } + } + + currentChange.addElement(changeElement(localname, curr_loc, false, true)); + currentDeletion = deletion(localname, curr_loc); + + LOGINFO_2(INFO,"CSBuilder: Found a deletion:%s:%s", + (const char*)localname, + (const char*)curr_loc); + + + // clear out the change state - if there was any. + deletionLevel = 0; + deletionIndex = 0; + previousDeletion = SDOXMLString(""); + + currentState = dealingWithDeletion; + + // Now add the attributes if there are any. + + for (int i=0; i < attributes.size(); i++) + { + // push all the attributes into the deletion record. + SDOXMLString name = attributes[i].getName(); + if (!name.equalsIgnoreCase("ref")) + { + SDOXMLString value = attributes[i].getValue(); + currentDeletion.addAttribute( + deletionAttribute(name,value)); + } + } + + LOGEXIT(INFO,"CSBuilder:processStart Exit5"); + return; + } + if (currentState == dealingWithDeletion) + { + // we are already in a deletion, and entering an element + if (!previousDeletion.equals(localname)) + { + deletionIndex = 0; + previousDeletion = localname; + } + else + { + deletionIndex++; + } + + sprintf(cbuf,"%d",deletionIndex); + currentLocation.push_back(localname + "." + cbuf); + + // First case - its a placeholder for an element in a list + // all we have to do is keep track of the list index. + + if (attributes.size() == 1) + { + SDOXMLString name = attributes[0].getName(); + if (name.equalsIgnoreCase("ref")) + { + LOGINFO(INFO,"CSBuilder: The element is a reference to an existing entry in a list"); + + currentState = dealingWithDeletionElement; + + LOGEXIT(INFO,"CSBuilder:processStart Exit6"); + return; + } + } + + SDOXMLString curr_loc = ""; + if (currentLocation.size() > 0) + { + for (int pi = 0; pi < currentLocation.size()-1; pi++) + { + curr_loc = curr_loc + currentLocation[pi]; + curr_loc = curr_loc + "/"; + } + curr_loc = curr_loc + currentLocation[currentLocation.size()-1]; + } + + if (attributes.size() == 0) + { + // It could be a many-valued primitive, or + // a deletion with no attributes + // can we match the current path to a known deletion? + bool isDelete = false; + + for (int i = 0; i < createDeletes.size(); i++) + { + if (createDeletes[i].type.equals("delete")) + { + if (curr_loc.equals(createDeletes[i].value)) + { + LOGINFO(INFO,"CSBuilder: An existing delete was found - its a delete"); + + isDelete = true; + break; // out of the for loop + } + } + } + if (!isDelete) + { + LOGINFO(INFO,"CSBuilder: Found a change with no atts, and no deletion matches - its an element"); + + // and will get picked up by the 'characters' method. + currentState = dealingWithDeletionElement; + + LOGEXIT(INFO,"CSBuilder:processStart Exit7"); + return; + } + } + + + // We are starting a new deletion record + + LOGINFO_2(INFO,"CSBuilder: Found a deletion within a deletion:%s:%s", + (const char*)localname, (const char*)curr_loc); + + deletionList.push_back(deletionListElement(currentDeletion,deletionIndex, + previousDeletion)); + + currentDeletion = deletion(localname, curr_loc); + + // we are in a nested delete - so record the level such that we can pop state + // from the deletionList on coming back out of this. + + deletionLevel++; + //deletionIndex = 0; + previousDeletion = SDOXMLString(""); + + currentState = dealingWithDeletion; + + // Now add the attributes if there are any. + + for (int i=0; i < attributes.size(); i++) + { + // push all the attributes into the deletion record. + SDOXMLString name = attributes[i].getName(); + if (!name.equalsIgnoreCase("ref")) + { + SDOXMLString value = attributes[i].getValue(); + currentDeletion.addAttribute( + deletionAttribute(name,value)); + } + } + + LOGEXIT(INFO,"CSBuilder:processStart Exit8"); + return; + + } + } + +// ======================================================================== +// Parser ends an element +// ======================================================================== + + void ChangeSummaryBuilder::processEnd( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI) + { + + LOGENTRY(INFO,"CSBuilder:processEnd"); + + if (currentState == dealingWithCreateDelete) + { + // its already been completed by the characters message + currentState = baseState; + LOGEXIT(INFO,"CSBuilder:processEnd Exit1"); + return; + } + else if (currentState == dealingWithChangeElement) + { + // its already been completed by the characters message + currentState = dealingWithChange; + currentLocation.pop_back(); + LOGEXIT(INFO,"CSBuilder:processEnd Exit2"); + return; + } + else if (currentState == dealingWithDeletionElement) + { + // its already been completed by the characters message + currentState = dealingWithDeletion; + currentLocation.pop_back(); + LOGEXIT(INFO,"CSBuilder:processEnd Exit3"); + return; + } + else if (currentState == dealingWithChange) + { + // we should have finished, there are no nested changes + currentState = baseState; + changes.insert(changes.end(),currentChange); + currentLocation.clear(); + LOGEXIT(INFO,"CSBuilder:processEnd Exit4"); + return; + } + else if (currentState == dealingWithDeletion) + { + currentLocation.pop_back(); + deletions.insert(deletions.end(),currentDeletion); + if (deletionLevel > 0) + { + deletionLevel--; + if (deletionList.size() > 0) + { + int index = deletionIndex; + SDOXMLString path = currentDeletion.reference; + SDOXMLString name = currentDeletion.name; + + deletionListElement dl = deletionList[deletionList.size()-1]; + currentDeletion = dl.del; + deletionIndex = dl.index; + previousDeletion = dl.previous; + deletionList.pop_back(); + // and insert the inside deletion in the outside one. + currentDeletion.insertElement(deletionElement( + name, path,index)); + } + + LOGEXIT(INFO,"CSBuilder:processEnd Exit5"); + return; + } + else + { + currentState = dealingWithChange; + + LOGEXIT(INFO,"CSBuilder:processEnd Exit6"); + return; + } + } + } + +// ======================================================================== +// Parse characters +// ======================================================================== + + + void ChangeSummaryBuilder::processChars( + const SDOXMLString& chars) + { + LOGENTRY(INFO,"CSBuilder:processChars"); + + if (currentState == dealingWithCreateDelete) + { + // this is text within a create/delete indicating the + // value of the item deleted/created. + if (createDeletes.size() > 0) + { + createDeletes[createDeletes.size()-1].value = chars; + LOGINFO_1(INFO,"CSBuilder:characters create/delete:%s", + (const char*)chars); + } + LOGEXIT(INFO,"CSBuilder:processChars Exit1"); + return; + } + else if (currentState == dealingWithChangeElement) + { + changeElement ce = changeElement(currentLocalName, previousChange, false, false); + ce.value = chars; + ce.index = changeIndex; + currentChange.addElement(ce); + + LOGINFO_1(INFO,"CSBuilder: Characters in a change element:%s", + (const char *)chars); + + LOGEXIT(INFO,"CSBuilder:processChars Exit2"); + return; + } + else if (currentState == dealingWithDeletionElement) + { + deletionElement ce = deletionElement(previousDeletion); + ce.value = chars; + ce.index = deletionIndex; + currentDeletion.addElement(ce); + + LOGINFO_1(INFO,"CSBuilder: Characters in a deletion element:%s", + (const char *)chars); + + LOGEXIT(INFO,"CSBuilder:processChars Exit3"); + return; + } + + LOGINFO_1(INFO,"CSBuilder: Characters in nothing!!:%s", + (const char *)chars); + LOGEXIT(INFO,"CSBuilder:processChars Exit4"); + } + + +// ======================================================================== +// Classes holding temporary parsed information +// ======================================================================== + + + ///////////////////////////////////////////////// + // An element in the list of creates/deletes + ///////////////////////////////////////////////// + + createDelete::createDelete() + { + } + + createDelete::createDelete(SDOXMLString intype) : + type(intype) + { + indexshift = 0; + } + + createDelete::~createDelete() + { + } + + ///////////////////////////////////////////////// + // An element in the list of changes + ///////////////////////////////////////////////// + + changeAttribute::changeAttribute() + { + } + + changeAttribute::changeAttribute(SDOXMLString inname, + SDOXMLString invalue): name(inname), value(invalue) + { + } + + changeAttribute::~changeAttribute() + { + } + + changeElement::changeElement() + { + } + + changeElement::changeElement(SDOXMLString inname, + SDOXMLString inpath, bool isRef, bool isDel) + : name(inname) , path(inpath) + { + isReference=isRef; + isDeletion= isDel; + } + + changeElement::changeElement(SDOXMLString inname, + SDOXMLString inpath, + SDOXMLString invalue, bool isRef, bool isDel) + : name(inname), value(invalue), path(inpath) + { + isReference=isRef; + isDeletion= isDel; + } + + changeElement::~changeElement() + { + } + + change::change() + { + } + + change::change(SDOXMLString inname, SDOXMLString ref): + name(inname), reference(ref) + { + } + + void change::addAttribute(changeAttribute ca) + { + attributes.insert(attributes.end(),ca); + } + + void change::addElement(changeElement ce) + { + elements.insert(elements.end(),ce); + } + + ///////////////////////////////////////////////// + // An element in the list of deletions + ///////////////////////////////////////////////// + + deletionAttribute::deletionAttribute() + { + } + + deletionAttribute::deletionAttribute(SDOXMLString inname, + SDOXMLString invalue): name(inname), value(invalue) + { + } + + deletionAttribute::~deletionAttribute() + { + } + + deletionElement::deletionElement() + { + } + + deletionElement::deletionElement(SDOXMLString inname) + : name(inname) + { + isDeletion = false; + } + + deletionElement::deletionElement(SDOXMLString inname, + SDOXMLString inpath, int inindex) + : name(inname), value(inpath), index(inindex) + { + isDeletion = true; + } + + deletionElement::~deletionElement() + { + } + + deletion::deletion() + { + } + + deletion::deletion(SDOXMLString inname, SDOXMLString ref): + name(inname), reference(ref) + { + completedprocessing=false; + } + + void deletion::addAttribute(deletionAttribute ca) + { + attributes.insert(attributes.end(),ca); + } + + void deletion::addElement(deletionElement ce) + { + elements.insert(elements.end(),ce); + } + + void deletion::insertElement(deletionElement ce) + { + elements.insert(elements.begin(),ce); + } + + deletionListElement::deletionListElement() + { + } + + deletionListElement::deletionListElement( + deletion in_del, + int in_index, + SDOXMLString in_prev): + del(in_del), index(in_index), previous(in_prev) + { + } + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryBuilder.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryBuilder.h new file mode 100644 index 0000000000..903ef0f427 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryBuilder.h @@ -0,0 +1,300 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _CHANGESUMMARYBUILDER_H_ +#define _CHANGESUMMARYBUILDER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SAX2Parser.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/PropertySetting.h" +#include "commonj/sdo/ChangeSummaryImpl.h" + + +#include <stack> + +namespace commonj +{ + namespace sdo + { + +/** + * createDelete is a class holding a creation or deletion in + * a change summary builder. + * When rebuilding a change summary from the serialized version + * creates and deletes are stored in these until they can be + * converted into a change summary. + */ + + + class createDelete + { + public: + createDelete(); + createDelete(SDOXMLString intype); + virtual ~createDelete(); + SDOXMLString type; + SDOXMLString value; + int indexshift; + }; + +/** + * changeAttribute is a class holding a changed attribute in a + * change summary builder. + * When rebuilding a change summary from the serialized version + * changes are stored in these until they can be + * converted into a change summary. + */ + + class changeAttribute + { + public: + changeAttribute(); + changeAttribute(SDOXMLString inname, + SDOXMLString invalue); + virtual ~changeAttribute(); + SDOXMLString name; + SDOXMLString value; + }; + +/** + * changeElement is a class holding a changed element in a change summary builder. + * When rebuilding a change summary from the serialized version + * changes are stored in these until they can be + * converted into a change summary. + */ + class changeElement + { + public: + changeElement(); + changeElement(SDOXMLString inname, + SDOXMLString inpath, bool isRef, bool isDel); + changeElement(SDOXMLString inname, + SDOXMLString inpath, + SDOXMLString invalue, bool isRef, bool isDel); + virtual ~changeElement(); + SDOXMLString name; + SDOXMLString value; + SDOXMLString path; + bool isReference; + bool isDeletion; + int index; + }; + +/** + * change is a class holding a change in a change summary builder. + * When rebuilding a change summary from the serialized version + * changes are stored in these until they can be + * converted into a change summary. + * Changes consist of changeAttributes and changeElements + */ + + + class change + { + public: + change(); + change(SDOXMLString inname, SDOXMLString ref); + void addAttribute(changeAttribute ca); + void addElement(changeElement ce); + std::list<changeAttribute> attributes; + std::list<changeElement> elements; + SDOXMLString name; + SDOXMLString reference; + }; + +/** + * deletionAttribute is a class holding a deletion attribute in a change summary builder. + * When rebuilding a change summary from the serialized version + * deletions are stored in these until they can be + * converted into a change summary. + * Changes consist of deletionAttributes and deletionElements + */ + class deletionAttribute + { + public: + deletionAttribute(); + deletionAttribute(SDOXMLString inname, + SDOXMLString invalue); + virtual ~deletionAttribute(); + SDOXMLString name; + SDOXMLString value; + }; + +/** + * deletionElement is a class holding a deletion element in a change summary builder. + * When rebuilding a change summary from the serialized version + * deletions are stored in these until they can be + * converted into a change summary. + * Changes consist of deletionAttributes and deletionElements + */ + class deletionElement + { + public: + deletionElement(); + deletionElement(SDOXMLString inname); + deletionElement(SDOXMLString inname, + SDOXMLString inpath, int inindex); + virtual ~deletionElement(); + SDOXMLString name; + SDOXMLString value; + bool isDeletion; + int index; + }; + + +/** + * deletions is a class holding a deletion in a change summary builder. + * When rebuilding a change summary from the serialized version + * deletions are stored in these until they can be + * converted into a change summary. + * Changes consist of deletionAttributes and deletionElements + */ + + class deletion + { + public: + deletion(); + deletion(SDOXMLString inname, SDOXMLString ref); + void addAttribute(deletionAttribute ca); + void addElement(deletionElement ce); + void insertElement(deletionElement ce); + SDOXMLString name; + SDOXMLString reference; + DataObjectPtr dob; /* the recreated one*/ + std::list<deletionAttribute> attributes; + std::list<deletionElement> elements; + bool completedprocessing; + }; + + /** deletionListElement is an item in a list of deletions in a change summary builder. + * + * All the deletions are stored whilst rebuilding a change + * summary, then applied. These list elements hold them. + */ + + class deletionListElement + { + public: + deletionListElement(); + deletionListElement(deletion in_del, int in_index, SDOXMLString in_prev); + SDOXMLString previous; + deletion del; + int index; + }; + +/** + * The ChangeSummaryBuilder recreates a change summary from the + * XML representations of the changes, creations and deletions. + * It does this by populating a list of changes as though they had + * been applied to the current data graph. + */ + + class ChangeSummaryBuilder + { + + + public: + + enum CsState + { + baseState, + dealingWithCreateDelete, + dealingWithChange, + dealingWithChangeElement, + dealingWithDeletion, + dealingWithDeletionElement + }; + + + ChangeSummaryBuilder( + DataFactoryPtr df, + DataObjectPtr& rootDO); + + virtual ~ChangeSummaryBuilder(); + + + virtual void processStart( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void processChars( + const SDOXMLString& chars); + + virtual void processEnd( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI); + + virtual void buildChangeSummary( + DataObjectPtr changeSummaryDO); + + virtual void populateDeletion(ChangeSummaryImpl* csi, DataObjectPtr dob, + int index); + + virtual void handleDeletion( + ChangeSummaryImpl* csi, + int currentIndex, + DataObjectPtr cont, + SDOXMLString path, + SDOXMLString prop); + + virtual void handleDeletion(ChangeSummaryImpl* csi, + int index, + SDOXMLString path); + + void shiftIndices(int index, int delta); + + SDOXMLString shiftedIndex(int index); + + + private: + DataFactoryPtr dataFactory; + DataObjectPtr& rootDataObject; + + CsState currentState; + + std::vector<deletionListElement> deletionList; + std::vector<SDOXMLString> currentLocation; + std::vector<createDelete> createDeletes; + + std::vector<change> changes; + change currentChange; + SDOXMLString previousChange; + SDOXMLString currentLocalName; + int changeIndex; + + std::vector<deletion> deletions; + deletion currentDeletion; + SDOXMLString previousDeletion; + int deletionIndex; + int deletionLevel; + + + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif //_CHANGESUMMARYBUILDER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryImpl.cpp new file mode 100644 index 0000000000..6fefb289d9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryImpl.cpp @@ -0,0 +1,1589 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/17 16:01:05 $ */ + +#include "commonj/sdo/ChangeSummaryImpl.h" + +#include "commonj/sdo/DataObjectImpl.h" + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/DataObjectList.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/Logging.h" + + +namespace commonj{ +namespace sdo{ + + + // Initializes an empty change summary, so we know one is required + ChangeSummaryImpl::ChangeSummaryImpl() + { + logging = false; + } + + ChangeSummaryImpl::~ChangeSummaryImpl() + { + //Force logging off or bad things will happen! + logging = false; + + /** + * These remove the logitems, so cause the + * refcounts of the data objects to drop, and + * delete the settings lists. + */ + deletedMap.clear(); + createdMap.clear(); + changedMap.clear(); + changedDataObjects.clear(); + } + + SequencePtr ChangeSummaryImpl::getOldSequence(DataObjectPtr dob) + { + DELETELOG_MAP::iterator deleteLogIter; + + DataObject* ob = dob; + deleteLogIter = deletedMap.find((DataObjectImpl*)ob); + + if (deleteLogIter != deletedMap.end()) + { + return (deleteLogIter->second).getSequence(); + } + + CHANGELOG_MAP::iterator changeLogIter; + + changeLogIter = changedMap.find((DataObjectImpl*)ob); + + if (changeLogIter != changedMap.end()) + { + return (changeLogIter->second).getSequence(); + } + return NULL; + + } + + void ChangeSummaryImpl::removeFromChanges(DataObjectImpl* ob) + { + int i = changedDataObjects.size(); + + /** + * this is used to remove only the most recent change. + * A deletion has occurred, and there was a creation, so + * we remove the creation. There cannot be a change after the + * creation, so the last entry in changes is the creation. + * there could be a previous deletion of the same object, so + * we should not clear the whole list. + */ + while (i > 0) + { + i--; + + + if (changedDataObjects.get(i) == ob) + { + changedDataObjects.remove(i); + return; + } + } + } + + DataObjectPtr ChangeSummaryImpl::matchDeletedObject(SDOXMLString path) + { + DELETELOG_MAP::iterator deleteLogIter; + + for (deleteLogIter = deletedMap.begin(); + deleteLogIter != deletedMap.end(); ++deleteLogIter) + { + if ( + path.equals( + SDOXMLString((deleteLogIter->second).getOldXpath()) + ) + ) + { + return deleteLogIter->first; + } + } + return DataObjectPtr(0); + } + + + + void ChangeSummaryImpl::logDeletion(DataObjectImpl* ob, + DataObjectImpl* container, const Property& prop, + const char* oldpath, bool loggingChildren) + { + LOGINFO_1(INFO,"ChangeSummary:LogDelete:%s", + ob->getType().getName()); + + /** + * The object is about to be deleted, so we need + * all its property Settings recorded in the list + * of changed data objects. We also need to know + * its old container, container property, and + * value. + */ + + // find any properties which are data objects, log their + // deletion first. + + int i; + + // Trace for change summaries + + LOGINFO_2(INFO,"ChangeSummary logs a deletion of property %s type %s", + prop.getName(), prop.getType().getName()); + + + CREATELOG_MAP::iterator createLogIter; + CHANGELOG_MAP::iterator changeLogIter; + + createLogIter = createdMap.find(ob); + if (createLogIter != createdMap.end()) + { + // would need to remove it from the created list. + LOGINFO(INFO,"ChangeSummary: The deletion was already created - just removing it"); + + removeFromChanges(ob); + createdMap.erase(ob); + // find the container in the change map. + + changeLogIter = changedMap.find(container); + if (changeLogIter != changedMap.end()) + { + // would hope there was an entry + int index; + if (prop.isMany()) + { + DataObjectList& dl = container->getList(prop); + for (index=0;index<dl.size();index++) + { + if (dl[index] == ob) + { + break; + } + } + } + else + { + index = 0; + } + + SettingList& slist = (changeLogIter->second).getSettings(); + + for (int j=0 ; j < slist.size();j++) + { + if (!strcmp(slist.get(j)->getProperty().getName(), + prop.getName()) + + + && slist.get(j)->getIndex() == + index) + { + // these are settings of the same prop/index, we + // need to remove this entry + slist.remove(j); + // and if this was the only change, then we + // need to remoe the container from the changes + if (slist.size() == 0) + { + changedMap.erase(container); + removeFromChanges(container); + } + break; // must not continue - size is now wrong + } + } + } + return; + } + + DELETELOG_MAP::iterator deleteLogIter; + + deleteLogIter = deletedMap.find(ob); + + if (deleteLogIter != deletedMap.end()) + { + LOGINFO(INFO,"ChangeSummary - delete an already deleted object"); + return; + } + + PropertyList pl = ob->getInstanceProperties(); + DataObject* dob; + + if (loggingChildren) + { + for (i=0; i < pl.size(); i++) + { + if (pl[i].getType().isDataObjectType()) + { + if (pl[i].isMany()) { + DataObjectList& dl = ob->getList(pl[i]); + for (int j = dl.size() - 1; j>=0; j--) + { + dob = dl[j]; + if (dob)logDeletion((DataObjectImpl*)dob,ob,pl[i], + dob->objectToXPath(), true); + } + } + else { + dob = ob->getDataObject(pl[i]); + if (dob)logDeletion((DataObjectImpl*)(dob),ob,pl[i], + dob->objectToXPath(), true); + } + } + } + } + + + // build a Setting list for the set properties + + deletedMap.insert(std::make_pair(ob,deleteLogItem( + (DataObject*)ob, prop,ob->getSequence(), + oldpath, + container))); + deleteLogIter = deletedMap.find(ob); + SettingList& sl = (deleteLogIter->second).getSettings(); + + void* value; + unsigned int len; + + for (i=0; i < pl.size(); i++) + { + //if (!pl[i].getType().isDataType()) continue; + + if (!ob->isSet(pl[i])) + { + sl.append(new Setting(false,false, 0,0,pl[i],0)); + continue; + } + if (pl[i].isMany()) + { + + DataObjectList& dol = ob->getList(pl[i]); + for (int j=dol.size()-1;j >= 0; j--) + { + // needs to be the data object in cases where... + if (pl[i].getType().isDataType()) { + setPropValue(&value,&len,ob,pl[j]); + sl.append(new Setting(true,false,value,len,pl[i],j)); + } + else { + value = (void*)dol[j]; + sl.append(new Setting(true,false,value,0,pl[i],j)); + } + } + } + else + { + setPropValue(&value,&len,ob,pl[i]); + sl.append(new Setting(true,ob->isNull(pl[i]),value,len,pl[i],0)); + } + + } + + + changeLogIter = changedMap.find(ob); + if (changeLogIter != changedMap.end()) + { + // we have already changed this object, so we need the old values + // from the change, and to remove the changed map entry + LOGINFO(INFO,"ChangeSummary found a deleted item in then changes"); + + (deleteLogIter->second).setSequence((changeLogIter->second).getSequence()); + + SettingList& slist = (changeLogIter->second).getSettings(); + + for (int j=0 ; j < slist.size();j++) + { + for (int i=0;i<sl.size();i++) + { + if (!strcmp(slist.get(j)->getProperty().getName(), + sl.get(i)->getProperty().getName()) + + + && slist.get(j)->getIndex() == + sl.get(i)->getIndex()) + { + // these are settings of the same prop/index, we + // need the old value to get transferred. + sl.remove(i); + sl.insert(i,new Setting(*(slist.get(j)))); + + } + } + } + LOGINFO(INFO, "ChangeSummary: Erasing from changes"); + changedMap.erase(ob); + } + // We append deleted objects to the changed list - this list gives + // those data objects which have been affected - we then look at their + // current and old property values to find out whether they have been + // deleted or created. + else + { + changedDataObjects.append(ob, ChangedDataObjectList::Delete); + } + + LOGINFO(INFO,"ChangeSummary: Deletion being added to the list"); + + return; + } + + void ChangeSummaryImpl::logCreation(DataObjectImpl* ob, + DataObjectImpl* container, const Property& prop) + { + + LOGINFO_1(INFO,"ChangeSummary:LogCreate of type:%s",ob->getType().getName()); + + // These we just need to record the fact that they + // are present. We dont have an original value to + // store. + // log a change to the container of this object + // + + DELETELOG_MAP::iterator deleteLogIter; + + deleteLogIter = deletedMap.find(ob); + if (deleteLogIter != deletedMap.end()) + { + // can happen - a delete is really a removal from the tree. + // Adding back an object which you held a pointer to is just + // a re-creation. + LOGINFO(INFO,"ChangeSummary: Adding in a pre-deleted object"); + } + + // we should check if this object has sub-objects, they will + // need to be created too + + PropertyList pl = ob->getInstanceProperties(); + for (int p=0;p<pl.size();p++) + { + Property& thisprop = pl[p]; + if (!thisprop.getType().isDataType()) + { + if (ob->isSet(thisprop)) + { + DataObject* dp; + + if (thisprop.isMany()) + { + DataObjectList& dol = ob->getList(thisprop); + for (int ds = 0; ds < dol.size(); ds++) + { + dp = dol[ds]; + if (!dp) continue; + logCreation((DataObjectImpl*)dp,ob,thisprop); + } + } + else + { + dp = ob->getDataObject(thisprop); + if (dp) + { + logCreation((DataObjectImpl*)dp,ob,thisprop); + } + } + } + } + } + + CREATELOG_MAP::iterator createLogIter; + + createLogIter = createdMap.find(ob); + if (createLogIter != createdMap.end()) + { + // this could be a reference - we dont add it twice. + LOGINFO(INFO,"ChangeSummary: No need to log creation twice"); + return; + } + + // We append created objects to the changed list - this list gives + // those data objects which have been affected - we then look at their + // current and old property values to find out whether they have been + // deleted or created. + changedDataObjects.append(ob, ChangedDataObjectList::Create); + + createdMap.insert(std::make_pair(ob,createLogItem(ob->getType(),prop,container))); + return; + } + + + void ChangeSummaryImpl::setPropValue(void** value, unsigned int* len, DataObjectImpl* ob, const Property& prop) + { + + *len = 0; + switch (prop.getTypeEnum()) + { + case Type::BooleanType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = 0; + } + else + { + *(long*)*value = (long)ob->getBoolean(prop); + } + break; + case Type::ByteType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = 0; + } + else + { + *(long*)*value = (long)ob->getByte(prop); + } + break; + case Type::CharacterType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = 0; + } + else + { + *(long*)*value = (long)ob->getCharacter(prop); + } + break; + case Type::IntegerType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = 0; + } + else + { + *(long*)*value = (long)ob->getInteger(prop); + } + break; + case Type::ShortType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = 0; + } + else + { + *(long*)*value = (long)ob->getShort(prop); + } + break; + case Type::DoubleType: + *value = new long double; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long double*)value = (long double)0; + } + else + { + *(long double*)*value = (long double)ob->getDouble(prop); + } + break; + case Type::FloatType: + *value = new float; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(float*)value = (float)0; + } + else + { + *(float*)*value = (float)ob->getFloat(prop); + } + break; + case Type::LongType: + *value = new int64_t; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(int64_t*)value = (int64_t)0; + } + else + { + *(int64_t*)*value = (int64_t)ob->getLong(prop); + } + break; + case Type::DateType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)(ob->getDate(prop).getTime()); + } + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *value = 0; + *len = 0; + } + else + { + unsigned int siz = ob->getLength(prop); + if (siz > 0) { + *value = new wchar_t[siz]; + *len = ob->getString(prop,(wchar_t*)*value, siz); + } + else { + *value = 0; + *len = 0; + } + } + break; + case Type::BytesType: + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *value = 0; + *len = 0; + } + else + { + unsigned int siz = ob->getLength(prop); + if (siz > 0) { + *value = new char[siz]; + *len = ob->getBytes(prop,(char*)*value, siz); + } + else { + *value = 0; + *len = 0; + } + } + break; + case Type::OtherTypes: + case Type::DataObjectType: + case Type::ChangeSummaryType: + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *value = 0; + } + else + { + *value = (void*)ob->getDataObject(prop); + } + break; + default: + SDO_THROW_EXCEPTION("(ChangeSummary)setPropValue" , + SDOUnsupportedOperationException, "Type is not recognised and cannot be saved"); + break; + } + } + + void ChangeSummaryImpl::setManyPropValue(void** value, unsigned int *len, DataObjectImpl* ob, + DataObjectImpl* listob, const Property& prop) + { + + *len = 0; + switch (prop.getTypeEnum()) + { + case Type::BooleanType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)listob->getBoolean(); + } + break; + case Type::ByteType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)listob->getByte(); + } + break; + case Type::CharacterType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)listob->getCharacter(); + } + break; + case Type::IntegerType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)listob->getInteger(); + } + break; + case Type::ShortType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)listob->getShort(); + } + break; + case Type::DoubleType: + *value = new long double; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long double*)value = (long double)0; + } + else + { + *(long double*)*value = (long double)listob->getDouble(); + } + break; + case Type::FloatType: + *value = new float; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(float*)value = (float)0; + } + else + { + *(float*)*value = (float)listob->getFloat(); + } + break; + case Type::LongType: + *value = new int64_t; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(int64_t*)value = (int64_t)0; + } + else + { + *(int64_t*)*value = (int64_t)listob->getLong(); + } + break; + case Type::DateType: + *value = new long; + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *(long*)value = (long)0; + } + else + { + *(long*)*value = (long)(listob->getDate().getTime()); + } + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *value = 0; + *len = 0; + } + else + { + unsigned int siz = listob->getLength(prop); + if (siz > 0) + { + *value = new wchar_t[siz]; + *len = listob->getString((wchar_t*)*value, siz); + } + } + break; + case Type::BytesType: + if (!ob->isSet(prop) && !prop.isDefaulted()) + { + *value = 0; + *len = 0; + } + else + { + unsigned int siz = listob->getLength(prop); + if (siz > 0) + { + *value = new char[siz]; + *len = listob->getBytes((char*)*value, siz); + } + } + break; + + case Type::OtherTypes: + case Type::DataObjectType: + case Type::ChangeSummaryType: + SDO_THROW_EXCEPTION("(ChangeSummary)setManyPropValue" , + SDOUnsupportedOperationException, "A many prop data object value is being set"); + //*value = (void*)ob; + break; + default: + SDO_THROW_EXCEPTION("(ChangeSummary)setManyPropValue" , + SDOUnsupportedOperationException, "Type is not recognised and cannot be saved"); + break; + } + } + + void ChangeSummaryImpl::logChange(DataObjectImpl* ob, + const Property& prop) + { + // need to record the old value, unless the object + // is in the created list, in which case we store + // nothing. + + LOGINFO_1(INFO,"ChangeSummary:LogChange %s",prop.getName()); + + CREATELOG_MAP::iterator createLogIter; + + unsigned int len; + + createLogIter = createdMap.find(ob); + if (createLogIter != createdMap.end()) + { + LOGINFO(INFO,"ChangeSummary: no need to log change"); + return; + } + + DELETELOG_MAP::iterator deleteLogIter; + + deleteLogIter = deletedMap.find(ob); + if (deleteLogIter != deletedMap.end()) + { + LOGINFO(INFO,"ChangeSummary: no need to log change - already deleted"); + return; + } + + CHANGELOG_MAP::iterator changeLogIter; + + changeLogIter = changedMap.find(ob); + if (changeLogIter == changedMap.end()) + { + LOGINFO(INFO,"ChangeSummary: A change to an object which was not previously changed"); + changedMap.insert(std::make_pair(ob, changeLogItem(ob->getType(),prop, + ob->getSequence(), ob))); + changedDataObjects.append(ob, ChangedDataObjectList::Change); + } + else + { + LOGINFO(INFO,"ChangeSummary: A change to an object which has already been changed"); + } + + changeLogIter = changedMap.find(ob); + if (changeLogIter == changedMap.end()) + { + LOGINFO(INFO,"ChangeSummary: Problem - no changes to append to"); + return; + } + + SettingList& slist = (changeLogIter->second).getSettings(); + + void* value; + + for (int i=0;i<slist.size();i++) + { + if (!strcmp(slist.get(i)->getProperty().getName(),prop.getName())) + { + LOGINFO(INFO,"ChangeSummary: Change of a property which was already changed - ignore"); + return; + } + } + + // need to check if the property has already been set, + // There could be many Settings if the item was a list, + // but we dont care here about that. + + if (!ob->isSet(prop)) + { + slist.append(new Setting(false,false,0,0,prop,0)); + return; + } + + if (prop.isMany()) + { + // We are appending, not modifying + // we need to store the list as it was. + + LOGINFO(INFO,"ChangeSummary: logging a change to a many valued property"); + + DataObjectList& dol = ob->getList(prop); + if (dol.size() == 0) + { + slist.append(new Setting(false,false,0,0,prop,0)); + return; + } + for (int i=0;i< dol.size(); i++) + { + DataObject* dob = dol[i]; + if (prop.getType().isDataType()) { + setManyPropValue(&value, &len, (DataObjectImpl*)ob, + (DataObjectImpl*)dob, prop); + slist.append(new Setting(true,false,value,len,prop,i)); + } + else{ + value = (void*)dob; + slist.append(new Setting(true,false,value,0,prop,i)); + } + } + } + else + { + setPropValue(&value,&len,ob,prop); + slist.append(new Setting(true,ob->isNull(prop),value,len,prop,0)); + } + + return; + } + + + + void ChangeSummaryImpl::undoChanges() + { + // TODO + /* Plan for undoChanges: + + There are three lists of information. + The created list is a list of data objects which were created during logging. + These data objects will have current state, and will represent the value of a + property of their containing object. As they had no state before they were + created, the undoChanges needs to unSet the property values for these first. + + The deleted list contains a list of objects which were deleted. The objects + themselves are not valid, but can be used to obtain a list of settings + representing the values of the properties at the time the object was + deleted. Here are recursive create is needed to re-create an object + similar to the deleted one, and set its properties using the settings. + The deleted object may well contain other deleted objects as its + property values, so these too will have entries in the deleted list, and + need to be found and re-created. + + The changed list holds a list of settings for properties of data objects + which have been changed. These objects may also be in the deleted list, so# + may not be valid. They will not be in the created list. First check that + the object is not in the deleted list. If it is, then the changes need to + be applied to the data object which we created when undoing the deleted list, + otherwise we just apply the change to a data object which exists. + */ + + /* what about items in many-valued properties? I guess we need to check and + search the values returned for the list to find the object to delete*/ + LOGINFO(INFO,"ChangeSummary UndoChanges not implemented"); + return; + } + + + void ChangeSummaryImpl::beginLogging() + { + + // Clear down the lists and their contents, if there was already + // some activity. + + if (logging) endLogging(); + changedMap.clear(); + deletedMap.clear(); + createdMap.clear(); + changedDataObjects.clear(); + + LOGINFO(INFO,"ChangeSummary: logging switched on"); + + logging = true; + return; + } + + void ChangeSummaryImpl::endLogging() + { + logging = false; + + LOGINFO(INFO,"ChangeSummary: logging switched off"); + + return; + } + + bool ChangeSummaryImpl::isLogging() + { + return logging; + } + +/////////////////////////////////////////////////////////////////////////////////////// + void ChangeSummaryImpl::debugPrint(){} +// { +// ChangedDataObjectList& dol = getChangedDataObjects(); +// +// CREATELOG_MAP::iterator createLogIter; +// DELETELOG_MAP::iterator deleteLogIter; +// CHANGELOG_MAP::iterator changeLogIter; +// +// for (int i=0;i<dol.size(); i++) +// { +// DataObject* dob = dol[i]; +// createLogIter = createdMap.find((DataObjectImpl*)dob); +// if (createLogIter != createdMap.end()) +// { +// cout << "Found a created object " << dol[i] << endl; +// return; +// } +// deleteLogIter = deletedMap.find((DataObjectImpl*)dob); +// if (deleteLogIter != deletedMap.end()) +// { +// cout << "Found a deleted object " << dol[i] << endl; +// return; +// } +// changeLogIter = changedMap.find((DataObjectImpl*)dob); +// if (changeLogIter != changedMap.end()) +// { +// cout << "Found a modified object " << dol[i] << endl; +// SettingList& sl = getOldValues(dob); +// for (int j=0; j < sl.size(); j++) +// { +// cout << "Old Value of " << sl[j].getProperty().getName(); +// if (sl[j].getProperty().isMany()) +// { +// cout << "[" << sl[j].getIndex() << "]" ; +// } +// cout << endl; +// switch (sl[j].getProperty().getTypeEnum()) +// { +// case Type::BooleanType: +// cout << "Boolean:" << sl[j].getBooleanValue(); +// break; +// case Type::ByteType: +// cout << "Byte:" << sl[j].getByteValue(); +// break; +// case Type::CharacterType: +// cout << "Character:" << sl[j].getCharacterValue(); +// break; +// case Type::IntegerType: +// cout << "Integer:" << sl[j].getIntegerValue(); +// break; +// case Type::ShortType: +// cout << "Short:" << sl[j].getShortValue(); +// break; +// case Type::DoubleType: +// cout << "Double:" << sl[j].getDoubleValue(); +// break; +// case Type::FloatType: +// cout << "Float:" << sl[j].getFloatValue(); +// break; +// case Type::LongType: +// cout << "Int64: (cant print)"; // << (*sl)[j]->getLongValue(); +// break; +// case Type::DateType: +// cout << "Date:" << sl[j].getDateValue().getTime(); +// break; +// case Type::BigDecimalType: +// case Type::BigIntegerType: +// case Type::StringType: +// case Type::UriType: +// { +// unsigned int len = sl[j].getLength(); +// if (len > 0) { +// wchar_t* buf = new wchar_t[len]; +// len = sl[j].getStringValue(buf,len); +// cout <<"String type" ; +// for (int i=0;i<len;i++) +// { +// cout << ":" << buf[i]; +// } +// delete buf; +// } +// break; +// } +// case Type::BytesType: +// { +// unsigned int len = sl[j].getLength(); +// if (len > 0) { +// char* buf = new char[len]; +// len = sl[j].getBytesValue(buf,len); +// cout <<"Bytes type" ; +// for (int i=0;i<len;i++) +// { +// cout << buf[i]; +// } +// delete buf; +// } +// break; +// } +// case Type::OtherTypes: +// case Type::DataObjectType: +// case Type::ChangeSummaryType: +// cout << "DataObject:" << sl[j].getDataObjectValue(); +// break; +// default: +// cout << "Unspecified type found in setting"; +// break; +// } +// cout << endl; +// } +// return; +// } +// cout << "Found an object which was not in the changes " << dol[i] << endl; +// +// } +// } +/////////////////////////////////////////////////////////////////////////////////////// + + ChangedDataObjectList& ChangeSummaryImpl::getChangedDataObjects() + { + // build a list of all the changes, in the same order + // as the actions occured, + + return changedDataObjects; + + } + + bool ChangeSummaryImpl::isCreated(DataObjectPtr dol) + { + CREATELOG_MAP::iterator createLogIter; + DataObject* dob = dol; + createLogIter = createdMap.find((DataObjectImpl*)dob); + + if (createLogIter != createdMap.end()) + return true; + return false; + } + + bool ChangeSummaryImpl::isDeleted(DataObjectPtr dol) + { + DELETELOG_MAP::iterator deleteLogIter; + DataObject* dob = dol; + deleteLogIter = deletedMap.find((DataObjectImpl*)dob); + + if (deleteLogIter != deletedMap.end()) + return true; + return false; + } + + bool ChangeSummaryImpl::isModified(DataObjectPtr dol) + { + CHANGELOG_MAP::iterator changeLogIter; + DataObject* dob = dol; + changeLogIter = changedMap.find((DataObjectImpl*)dob); + + if (changeLogIter != changedMap.end()) + return true; + return false; + } + + + + SettingList& ChangeSummaryImpl::getOldValues(DataObjectPtr dol) + { + CHANGELOG_MAP::iterator changeLogIter; + DELETELOG_MAP::iterator deleteLogIter; + DataObject* dob = dol; + // start with the deleted map... + deleteLogIter = deletedMap.find((DataObjectImpl*)dob); + if (deleteLogIter != deletedMap.end()){ + return ((deleteLogIter->second).getSettings()); + } + changeLogIter = changedMap.find((DataObjectImpl*)dob); + if (changeLogIter != changedMap.end()){ + return ((changeLogIter->second).getSettings()); + } + SDO_THROW_EXCEPTION("(ChangeSummary(getOldValues" , + SDOIndexOutOfRangeException, "Data object is not in the change summary"); + } + + + + const char* ChangeSummaryImpl::getOldXpath(RefCountingPointer<commonj::sdo::DataObject> dol) + { + DELETELOG_MAP::iterator deleteLogIter; + DataObject* dob = dol; + deleteLogIter = deletedMap.find((DataObjectImpl*)dob); + if (deleteLogIter != deletedMap.end()){ + return ((deleteLogIter->second).getOldXpath()); + } + return 0; + } + + + const Setting& ChangeSummaryImpl::getOldValue(DataObjectPtr dol, const Property& property) + { + DELETELOG_MAP::iterator deleteLogIter; + CHANGELOG_MAP::iterator changeLogIter; + DataObject* dob = dol; + + deleteLogIter = deletedMap.find((DataObjectImpl*)dob); + if (deleteLogIter != deletedMap.end()) + { + SettingList& sl = (deleteLogIter->second).getSettings(); + for (int i=0;i < sl.size(); i++) + { + if (!strcmp(property.getName(), + sl.get(i)->getProperty().getName())) + return (*sl.get(i)); + } + } + + changeLogIter = changedMap.find((DataObjectImpl*)dob); + if (changeLogIter != changedMap.end()) + { + SettingList& sl = (changeLogIter->second).getSettings(); + for (int i=0;i < sl.size(); i++) + { + if (!strcmp(property.getName(), + sl.get(i)->getProperty().getName())) + return (*sl.get(i)); + } + } + + SDO_THROW_EXCEPTION("(ChangeSummary(getOldValue)" , + SDOIndexOutOfRangeException, "Data object is not in the change summary"); + } + + DataObjectPtr ChangeSummaryImpl::getOldContainer(DataObjectPtr dol) + { + CHANGELOG_MAP::iterator changeLogIter; + DataObject* dob = dol; + changeLogIter = changedMap.find((DataObjectImpl*)dob); + + if (changeLogIter != changedMap.end()) + { + return (changeLogIter->second).getOldContainer(); + } + return 0; + } + + const Property& ChangeSummaryImpl::getOldContainmentProperty(DataObjectPtr dol) + { + CHANGELOG_MAP::iterator changeLogIter; + DataObject* dob = dol; + changeLogIter = changedMap.find((DataObjectImpl*)dob); + + if (changeLogIter == changedMap.end()) + { + SDO_THROW_EXCEPTION("(ChangeSummary(getOldContainmentProperty)" , + SDOIndexOutOfRangeException, "Data object is not in the change summary"); + } + return (changeLogIter->second).getOldContainmentProperty(); + } + + + // + // Creations and deletions can be just logged in the normal + // way. Changes have to be handled specially, because we + // need the old value, but the data object now contains the + // current value. + // + + void ChangeSummaryImpl::appendToCreations(const Property& p, + DataObjectPtr dob, DataObjectPtr cont) + { + LOGINFO(INFO,"ChangeSummary: Appending to creations list"); + DataObject* pdob = (DataObject*)dob; + DataObject* pcont = (DataObject*)cont; + logCreation((DataObjectImpl*)pdob,(DataObjectImpl*)pcont,p); + return; + } + + + void ChangeSummaryImpl::appendToDeletions(const Property& p, + DataObjectPtr dob, DataObjectPtr cont, const char* oldpath ) + { + DELETELOG_MAP::iterator deleteLogIter; + + LOGINFO_1(INFO,"ChangeSummary:Appending to deletions list %s",oldpath); + + DataObject* pdob = (DataObject*)dob; + DataObject* pcont = (DataObject*)cont; + logDeletion((DataObjectImpl*)pdob,(DataObjectImpl*)pcont,p, + oldpath, false); + return; + } + + + unsigned int ChangeSummaryImpl::stringConvert(char** value, const char* c, const Property& p) + { + // code duplicated from typeimpl + switch (p.getTypeEnum()) + { + case Type::BooleanType: + *value = new char[sizeof(long)]; + if ((c == 0) || strcmp(c,"true")) + { + *(long*)*value = 0; + } + else + { + *(long*)*value = 1; + } + return sizeof(long); + + case Type::ByteType: + case Type::CharacterType: + case Type::IntegerType: + case Type::ShortType: + *value = new char[sizeof(long)]; + *(long*)*value = atoi(c); + return sizeof(long); + + case Type::DoubleType: + *value = new char[sizeof(long double)]; + // TODO - atof not suitable here + *(long double*)*value = (long double)atof(c); + return sizeof(long double); + + case Type::FloatType: + *value = new char[sizeof(float)]; + *(float*)*value = (float)atof(c); + return sizeof(float); + + case Type::LongType: + *value = new char[sizeof(int64_t)]; +#if defined(WIN32) || defined (_WINDOWS) + *(int64_t*)*value = (int64_t)_atoi64(c); +#else + *(int64_t*)*value = (int64_t)strtoll(c, NULL, 0); +#endif + return sizeof(int64_t); + + case Type::DateType: + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)atoi(c); + return sizeof(time_t); + + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + { + char* vw = new char[(strlen(c)+1)*sizeof(wchar_t)]; + wchar_t* pvw = (wchar_t*)vw; + for (int i=0;i< strlen(c);i++) + { + pvw[i] = (wchar_t)c[i]; + } + pvw[strlen(c)] = 0; + *value = vw; + return strlen(c); + } + break; + case Type::BytesType: + { + char* vc = new char[strlen(c)+1]; + for (int i=0;i< strlen(c);i++) + { + vc[i] = (char)c[i]; + } + vc[strlen(c)] = 0; + *value = vc; + return strlen(c); + } + break; + + case Type::OtherTypes: + case Type::DataObjectType: + case Type::ChangeSummaryType: + default: + { + std::string msg("Cannot set CString on object of type:"); + msg += p.getType().getName(); + SDO_THROW_EXCEPTION("setString" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + void ChangeSummaryImpl::appendToChanges(const Property& p, + DataObjectPtr dob , SDOXMLString value, int index) + { + CHANGELOG_MAP::iterator changeLogIter; + + LOGINFO(INFO,"ChangeSummary Appending to changes list"); + + DataObject* pdob = (DataObject*)dob; + + + changeLogIter = changedMap.find((DataObjectImpl*)pdob); + if (changeLogIter == changedMap.end()) + { + + LOGINFO(INFO,"ChangeSummary: A change to an object which was not previously changed"); + + changedMap.insert(std::make_pair((DataObjectImpl*)pdob, + changeLogItem(dob->getType(),p, + dob->getSequence(), (DataObjectImpl*)pdob))); + changedDataObjects.append((DataObjectImpl*)pdob, + ChangedDataObjectList::Change); + } + + changeLogIter = changedMap.find((DataObjectImpl*)pdob); + if (changeLogIter == changedMap.end()) + { + + LOGINFO(INFO,"ChangeSummary: no changes to append to"); + + return; + } + + SettingList& slist = (changeLogIter->second).getSettings(); + + // simply need to insert a setting - no requirement to validate + // against existing settings + + char* datavalue = 0; + + unsigned int len = stringConvert(&datavalue, (const char*)value , p); + + slist.append(new Setting(true,false,datavalue,len,p,index)); + + // The datavalue will be freed by the deletion of the setting later + } + + + void ChangeSummaryImpl::appendToChanges(const Property& p, + DataObjectPtr dob , DataObjectPtr indob, int index) + { + CHANGELOG_MAP::iterator changeLogIter; + + LOGINFO(INFO,"ChangeSummary Appending to changes list (2)"); + + DataObject* pdob = (DataObject*)dob; + + changeLogIter = changedMap.find((DataObjectImpl*)pdob); + if (changeLogIter == changedMap.end()) + { + LOGINFO(INFO,"ChangeSummary: A change to an object which was not previously changed"); + + changedMap.insert(std::make_pair((DataObjectImpl*)pdob, + changeLogItem(dob->getType(),p, + dob->getSequence(), (DataObjectImpl*)pdob))); + changedDataObjects.append((DataObjectImpl*)pdob, + ChangedDataObjectList::Change); + } + + changeLogIter = changedMap.find((DataObjectImpl*)pdob); + if (changeLogIter == changedMap.end()) + { + LOGINFO(INFO,"ChangeSummary: Problem - no changes to append to"); + + return; + } + + SettingList& slist = (changeLogIter->second).getSettings(); + + // simply need to insert a setting - no requirement to validate + // against existing settings + + + slist.append(new Setting(true,false,(void*)indob,0,p,index)); + + } + + + + + ///////////////////////////////////////////////////////////// + // log items are for all lists, but contain different things + // depending on whether they are deletions, additions... + ///////////////////////////////////////////////////////////// + + createLogItem::createLogItem(const Type& tp, const Property& prop, + DataObjectImpl* cont) : + theOldContainmentProperty(prop), theOldContainer(cont), + theType(tp) + { + } + + DataObjectImpl* createLogItem::getOldContainer() + { + return theOldContainer; + } + + const Type& createLogItem::getOldType() + { + return theType; + } + + const Property& createLogItem::getOldContainmentProperty() + { + return theOldContainmentProperty; + } + + + + changeLogItem::changeLogItem(const Type& tp, + const Property& prop, + SequencePtr seq, + DataObjectImpl* cont) : + theOldContainmentProperty(prop), theOldContainer(cont), + theType(tp) + { + if (seq) + { + theSequence = new SequenceImpl((SequenceImpl*)seq); + } + else + { + theSequence = 0; + } + } + + changeLogItem::changeLogItem(const changeLogItem& cin) : + theOldContainmentProperty(cin.theOldContainmentProperty), + theType(cin.theType) + { + if (cin.theSequence) theSequence = new SequenceImpl((SequenceImpl*)cin.theSequence); + else theSequence = 0; + theOldContainer = cin.theOldContainer; + theSettings = cin.theSettings; + + } + + changeLogItem::~changeLogItem() + { + if (theSequence) delete theSequence; + } + + DataObjectImpl* changeLogItem::getOldContainer() + { + return theOldContainer; + } + + const Type& changeLogItem::getOldType() + { + return theType; + } + + const Property& changeLogItem::getOldContainmentProperty() + { + return theOldContainmentProperty; + } + + SettingList& changeLogItem::getSettings() + { + return theSettings; + } + + SequencePtr changeLogItem::getSequence() + { + return theSequence; + } + + + deleteLogItem::deleteLogItem(DataObject* dob, + const Property& prop, SequencePtr seq , + const char* oldpath, DataObjectImpl* cont + ) : + theOldContainmentProperty(prop), theOldContainer(cont), + theActualObject(dob), + theType(dob->getType()) + { + if (seq) + { + theSequence = new SequenceImpl((SequenceImpl*)seq); + } + else + { + theSequence = 0; + } + if (oldpath !=0 && strlen(oldpath) != 0) + { + theOldXpath = new char[strlen(oldpath)+1]; + strcpy(theOldXpath,oldpath); + } + else + { + theOldXpath = 0; + } + } + + const char* deleteLogItem::getOldXpath() + { + return theOldXpath; + } + + DataObjectImpl* deleteLogItem::getOldContainer() + { + return theOldContainer; + } + + deleteLogItem::deleteLogItem(const deleteLogItem& cin): + theOldContainmentProperty(cin.theOldContainmentProperty), + theType(cin.theType), theActualObject(cin.theActualObject) + { + if (cin.theSequence) theSequence = new SequenceImpl((SequenceImpl*)cin.theSequence); + else theSequence = 0; + theOldContainer = cin.theOldContainer; + theSettings = cin.theSettings; + if (cin.theOldXpath != 0) + { + theOldXpath = new char[strlen(cin.theOldXpath) + 1]; + strcpy(theOldXpath, cin.theOldXpath); + } + else + { + theOldXpath = 0; + } + } + + deleteLogItem::~deleteLogItem() + { + theActualObject = 0; + if (theSequence) delete theSequence; + if (theOldXpath != 0) + { + delete theOldXpath; + } + } + + const Type& deleteLogItem::getOldType() + { + return theType; + } + + const Property& deleteLogItem::getOldContainmentProperty() + { + return theOldContainmentProperty; + } + + SettingList& deleteLogItem::getSettings() + { + return theSettings; + } + + SequencePtr deleteLogItem::getSequence() + { + return theSequence; + } + + void deleteLogItem::setSequence(SequencePtr s) + { + if (theSequence) delete theSequence; + if (s) { + theSequence = new SequenceImpl((SequenceImpl*)s); + } + else { + theSequence = 0; + } + return; + } + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryImpl.h new file mode 100644 index 0000000000..38ca468484 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangeSummaryImpl.h @@ -0,0 +1,403 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _CHANGESUMMARYIMPL_H_ +#define _CHANGESUMMARYIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + + +#include "commonj/sdo/ChangedDataObjectListImpl.h" +#include "commonj/sdo/SettingList.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/SDOXMLString.h" + +#include <map> + +namespace commonj{ +namespace sdo { + + + /** + * ChangeLogItem is a part of a change summary. + * The change summary consisists of change items, + * deletion items and creation items. They are held in three + * lists as they have slightly different contents. + * The change log items hold old values for all the changes to + * properties of the data object concerned. + */ + + class changeLogItem { + + public: + + changeLogItem(const Type& tp, const Property& prop,SequencePtr seq, + DataObjectImpl* cont = 0 ); + changeLogItem(const changeLogItem& cin); + ~changeLogItem(); + DataObjectImpl* getOldContainer(); + const Property& getOldContainmentProperty(); + const Type& getOldType(); + SettingList& getSettings(); + SequencePtr getSequence(); + + private: + + const Property& theOldContainmentProperty; + DataObjectImpl* theOldContainer; + const Type& theType; + SettingList theSettings; + SequencePtr theSequence; + }; + + /** + * CreateLogItem is a part of a change summary. + * The change summary consisists of change items, + * deletion items and creation items. They are held in three + * lists as they have slightly different contents. + * The create log items hold the data object itself, + * and details of its container. + */ + + + class createLogItem { + + public: + + createLogItem(const Type& tp, const Property& prop, DataObjectImpl* cont = 0); + + + DataObjectImpl* getOldContainer(); + const Property& getOldContainmentProperty(); + const Type& getOldType(); + + private: + + const Property& theOldContainmentProperty; + DataObjectImpl* theOldContainer; + const Type& theType; + }; + + /** + * DeleteLogItem is a part of a change summary. + * The change summary consisists of change items, + * deletion items and creation items. They are held in three + * lists as they have slightly different contents. + * The delete log items hold the old data object , and + * details of the properties as they were before deletion + */ + + class deleteLogItem { + + public: + + + deleteLogItem(DataObject* dob, const Property& prop, + SequencePtr seq,const char *oldpath, + DataObjectImpl* cont = 0); + + + deleteLogItem(const deleteLogItem& cin); + ~deleteLogItem(); + DataObjectImpl* getOldContainer(); + const Property& getOldContainmentProperty(); + const Type& getOldType(); + const char* getOldXpath(); + SettingList& getSettings(); + SequencePtr getSequence(); + void setSequence(SequencePtr s); + + private: + + const Property& theOldContainmentProperty; + DataObjectImpl* theOldContainer; + + /** theActualObject + * A counting pointer to the object is held, such that the + * object is not freed, even if deleted. This rcp will not + * be used to refer to the object, but makes sure that the + * object does not reuse a memory address of a previously + * deleted object until the change summary is destroyed. + */ + + RefCountingPointer<DataObject> theActualObject; + const Type& theType; + SettingList theSettings; + SequencePtr theSequence; + char * theOldXpath; + }; + + + /** ChangeSummaryImpl implements the abstract class ChangeSummary. + * The change summary consisists of change items, + * deletion items and creation items. They are held in three + * lists as they have slightly different contents. + */ + + class ChangeSummaryImpl : public ChangeSummary + { + public: + ChangeSummaryImpl(); + + virtual ~ChangeSummaryImpl(); + + /** + * The new and modified objects in the list are references to objects that + * are associated with this change summary. + * The deleted objects in the list are references to copies of the objects + * as they appeared at the time that event logging was enabled; + * if the deleted objects have references to other objects, + * the references will also refer to copies of the target objects. + * Return a list of changed data objects. + */ + + virtual ChangedDataObjectList& getChangedDataObjects(); + + + /** getOldSettings returns a list of settings. + * Returns a list of Settings + * that represent the property values of the given dataObject + * at the point when logging began. + * In the case of a deleted object, + * the list will include Settings for all the properties. + * An old value Setting indicates the value at the + * point logging begins. A setting is only produced for + * modified objects if either the old value differs from the current value or + * if the isSet differs from the current value. + * No Settings are produced for created objects. + * Param dataObject the object in question. + * Return a list of settings. + */ + virtual SettingList& getOldValues(DataObjectPtr dataObject); + + /** getOldXpath returns the old path before the setting. + * + * Returns a path where the object was located before the setting took place. + */ + virtual const char* getOldXpath(RefCountingPointer<commonj::sdo::DataObject> dol); + + + /** beginLogging() sets the change summary in logging mode. + * + * The change summary is initially inactive. Setting it to logging mode + * starts the process of recording all the settings made. + */ + + virtual void beginLogging(); + + /** endLogging() stops logging. + * + * This method stops logging, but does not clear out the change summary. + * The changes are valid until the summary is next set to logging, at which time + * all old settings are lost. + */ + virtual void endLogging(); + + + + /** isLogging() returns true if logging is enabled. + * + * Indicates whether change logging is on (true) or off (false). + */ + + virtual bool isLogging(); + + + + /** isCreated() returns true if the object was created during logging. + * + * Returns whether or not the specified data object was created while logging. + * Any object that was added to the data graph + * but was not in the data graph when logging began, + * will be considered created. + * Param dataObject the data object in question. + * Return true if the specified data object was created. + */ + virtual bool isCreated(DataObjectPtr dataObject); + + /** isDeleted() - true if the object was deleted during logging. + * + * Returns whether or not the specified data object was deleted while logging. + * Any object that is not contained by the data graph will be considered + * deleted. + * Param dataObject the data object in question. + * Return true if the specified data object was deleted. + */ + virtual bool isDeleted(DataObjectPtr dataObject); + + + /** isModified() - true if the object was changed during logging. + * + * Returns whether or not the specified data object was updated while logging. + * An object that was contained in the data graph when logging began, + * and remains in the graph when logging ends will be considered for changes. + * An object considered modified must have at least one old value Setting. + * Param dataObject the data object in question. + * Return true if the specified data object was modified. + */ + virtual bool isModified(DataObjectPtr dataObject); + + /** getOldValue() gets the setting showing the old value. + * + * Returns a setting for the specified property + * representing the property value of the given dataObject + * at the point when logging began. + * Returns null if the property has not changed and + * has not been deleted. + * Param dataObject the object in question. + * Param property the property of the object. + * Return the Setting for the specified property. + */ + + virtual const Setting& getOldValue(DataObjectPtr dataObject, const Property& property); + + /** getOldContainer() gets the container before the setting. + * + * Returns the value of the container data object + * at the point when logging began. + * Param dataObject the object in question. + * Return the old container data object. + */ + virtual DataObjectPtr getOldContainer(DataObjectPtr dataObject); + + /** getOldContainmentProperty() - gives the property before setting. + * + * Returns the value of the containment property data object property + * at the point when logging began. + * Param dataObject the object in question. + * Return the old containment property. + */ + virtual const Property& getOldContainmentProperty(DataObjectPtr dataObject); + + /** undoChanges() - Not Implemented. + * + * NOT IMPLEMENTED + * + * Undoes all changes in the log to restore the tree of + * DataObjects to its original state when logging began. + * isLogging() is unchanged. The log is cleared. + */ + virtual void undoChanges(); + + /** getOldSequence() - Not Implemented. + * + * NOT IMPLEMENTED + * + * This method gives back the sequence of a data object as it + * appeared when logging was switched on. The data object may be + * a deleted data object or a changed data object. If the + * data object was not sequenced, this returns null. + */ + + virtual SDO_API SequencePtr getOldSequence(DataObjectPtr dataObject); + + bool isInCreatedMap(DataObjectImpl* ob); + + void logDeletion(DataObjectImpl* ob, + DataObjectImpl* cont, const Property& prop, + const char* oldpath, + bool loggingChildren = true + ); + + void logCreation(DataObjectImpl* ob, + DataObjectImpl* cont, const Property& prop + ); + + void logChange(DataObjectImpl* ob, const Property& prop + ); + + + SDO_API void debugPrint(); + + void removeFromChanges(DataObjectImpl* ob); + + + /** + * appendToCreations is used by deserialization + * This method helps to rebuild a change summary by populating the + * lists without the changes actually being logged. + */ + + void appendToCreations(const Property& p, + DataObjectPtr dob, + DataObjectPtr cont); + + + /** + * appendToDeletions is used by deserialization + * This method helps to rebuild a change summary by populating the + * lists without the changes actually being logged. + */ + void appendToDeletions(const Property& p, + DataObjectPtr dob, + DataObjectPtr cont, + const char* oldpath); + + + unsigned int stringConvert( + char** value, + const char* c, + const Property& p); + + /** + * appendToChangesis used by deserialization + * This method helps to rebuild a change summary by populating the + * lists without the changes actually being logged. + */ + + void appendToChanges(const Property& p, + DataObjectPtr dob, + SDOXMLString value, + int index); + + void appendToChanges(const Property& p, + DataObjectPtr dob, + DataObjectPtr pdob, + int index); + + DataObjectPtr matchDeletedObject(SDOXMLString path); + + + private: + + + void setPropValue(void** value, unsigned int *len, DataObjectImpl* ob, const Property& prop); + void setManyPropValue(void** value, unsigned int *len, DataObjectImpl* ob, + DataObjectImpl* listob, const Property& prop); + bool logging; + + typedef std::map<DataObjectImpl*, createLogItem> CREATELOG_MAP; + typedef std::map<DataObjectImpl*, deleteLogItem> DELETELOG_MAP; + typedef std::map<DataObjectImpl*, changeLogItem> CHANGELOG_MAP; + + CHANGELOG_MAP changedMap; + CREATELOG_MAP createdMap; + DELETELOG_MAP deletedMap; + + ChangedDataObjectListImpl changedDataObjects; + + + + + +}; +}; +}; +#endif //_CHANGESUMMARYIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectList.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectList.h new file mode 100644 index 0000000000..e28973041f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectList.h @@ -0,0 +1,91 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _CHANGEDDATAOBJECTLIST_H_ +#define _CHANGEDDATAOBJECTLIST_H_ + + +#include "commonj/sdo/RefCountingPointer.h" + +#include <vector> + +/** + * namespace commonj is the root namespace for SDO + */ + +namespace commonj{ + +/** + * sdo is the namespace holding the SDO core + */ + +namespace sdo{ + +class DataObject; + +/** + * + * A list for holding a record of changes which have happened + * during logging in a change summary. + */ + +class ChangedDataObjectList +{ + +public: + +/** \enum ChangeType + * + * An enum for create, change or delete types in a change record + */ + enum ChangeType + { + Undefined, + Create, + Change, + Delete + }; + +/** [] is the index operator. + * + * Gets the nth element of a list + */ + virtual SDO_API DataObjectPtr operator[] (int pos) = 0; + virtual SDO_API const DataObjectPtr operator[] (int pos) const = 0; + +/** size() returns the number of list elements. + * + * Returns the number of list elements + */ + + virtual SDO_API int size () const = 0; + +/** getType() returns the type of a list element. + * + * The type of change is one of the enum ChangeType, being a + * creation, a deletion or an update. + */ + + virtual SDO_API ChangeType getType(unsigned int index) = 0; + +}; +}; +}; +#endif + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectListImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectListImpl.cpp new file mode 100644 index 0000000000..7462376f01 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectListImpl.cpp @@ -0,0 +1,248 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + + +#include "commonj/sdo/ChangedDataObjectListImpl.h" + + +#include <iostream> +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/Logger.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/DataObjectImpl.h" + + +namespace commonj{ +namespace sdo { + + /** CDOListElement + * + * constructor + */ + + CDOListElement::CDOListElement() + { + theObject = 0; + theType = ChangedDataObjectList::Undefined; + } + + /** CDOListElement + * + * constructor from a data object and a change + */ + + CDOListElement::CDOListElement(DataObject* in, ChangedDataObjectList::ChangeType type) + { + theObject = in; + theType = type; + } + + /** ~CDOListElement() + * + * destructor + */ + + CDOListElement::~CDOListElement() + { + } + + /** getObject() + * + * return the changed data object + */ + + DataObject* CDOListElement::getObject() const + { + return theObject; + } + + /** + * + * return the type of change getType() + */ + + ChangedDataObjectList::ChangeType CDOListElement::getType() const + { + return theType; + } + + /** ChangedDataObjectListImpl + * + * constructor + */ + + ChangedDataObjectListImpl::ChangedDataObjectListImpl(CHANGEDDATAOBJECT_VECTOR p) : plist (p) + { + } + + /** ChangedDataObjectListImpl + * + * copy constructor + */ + + ChangedDataObjectListImpl::ChangedDataObjectListImpl(const ChangedDataObjectListImpl &pin) + { + plist = std::vector< CDOListElement >(pin.getVec()); + } + + /** ChangedDataObjectListImpl + * + * default constructor + */ + + ChangedDataObjectListImpl::ChangedDataObjectListImpl() + { + } + + + /** ~ChangedDataObjectListImpl + * + * destructor + */ + + ChangedDataObjectListImpl::~ChangedDataObjectListImpl() + { + } + + /** [] index operator + * + * + */ + + RefCountingPointer<DataObject> ChangedDataObjectListImpl::operator[] (int pos) + { + validateIndex(pos); + return plist[pos].getObject(); + } + + /** [] index operator + * + * + */ + + const RefCountingPointer<DataObject> ChangedDataObjectListImpl::operator[] (int pos) const + { + validateIndex(pos); + return plist[pos].getObject(); + } + + /** get() gets an element at the index. + * + */ + + DataObject* ChangedDataObjectListImpl::get(unsigned int pos) + { + validateIndex(pos); + return plist[pos].getObject(); + } + + /** size() returns the length of the list. + * + * + */ + + int ChangedDataObjectListImpl::size () const + { + return plist.size(); + } + + /** getVec() + * gets the vector which actually stores the data objects. + */ + + CHANGEDDATAOBJECT_VECTOR ChangedDataObjectListImpl::getVec() const + { + return plist; + } + + /** getType() + * returns the type of the change. + */ + + ChangedDataObjectList::ChangeType ChangedDataObjectListImpl::getType(unsigned int pos) + { + validateIndex(pos); + return plist[pos].getType(); + } + + + /** insert() + * inserts an element into the list. + */ + + void ChangedDataObjectListImpl::insert (unsigned int index, + DataObject *d, ChangedDataObjectList::ChangeType type) + { + plist.insert(plist.begin()+index, CDOListElement((DataObject*)d,type)); + } + + /** append() + * appends to the end of the list. + */ + + void ChangedDataObjectListImpl::append (DataObject *d, ChangedDataObjectList::ChangeType type) + { + plist.insert(plist.end(),CDOListElement((DataObject*)d, type)); + } + + /** clear() + * empties the list. + */ + + void ChangedDataObjectListImpl::clear () + { + plist.clear(); + } + + + /** remove() + * removes an item from the list. + */ + + void ChangedDataObjectListImpl::remove(unsigned int index) + { + validateIndex(index); + plist.erase(plist.begin() +index); + return ; + } + + /** validateIndex() + * checks that the index is in range. + */ + + void ChangedDataObjectListImpl::validateIndex(int index) const + { + if ((index < 0) || (index >= size())) + { + std::string msg("Invalid index : "); + msg += index; + SDO_THROW_EXCEPTION("(ChangeSummary)validateIndex", SDOIndexOutOfRangeException, + msg.c_str()); + + } + + } + + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectListImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectListImpl.h new file mode 100644 index 0000000000..9587a8402d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ChangedDataObjectListImpl.h @@ -0,0 +1,97 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _ChangedDataObjectListImplIMPL_H_ +#define _ChangedDataObjectListImplIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + + +#include <vector> + +#include "commonj/sdo/ChangedDataObjectList.h" +namespace commonj{ +namespace sdo{ + +class DataObjectImpl; +class DataObject; + +/** + * CDOListElement is an element of the changed data object list + * in a change summary,it may be a delete, addition or change. + */ + +class CDOListElement +{ +public: + CDOListElement (); + CDOListElement (DataObject* in, ChangedDataObjectList::ChangeType type); + virtual ~CDOListElement(); + virtual ChangedDataObjectList::ChangeType getType() const; + virtual DataObject* getObject() const; +private: + DataObject* theObject; + ChangedDataObjectList::ChangeType theType; +}; + +typedef std::vector< CDOListElement > CHANGEDDATAOBJECT_VECTOR; + + +/** + * ChangedDataObjectListImpl implements ChangedDataObjectList, part of a + * change summary. + * This is the list of objects which have been altered during + * logging of a change summary. + */ + +class ChangedDataObjectListImpl : public ChangedDataObjectList +{ + +public: + ChangedDataObjectListImpl(CHANGEDDATAOBJECT_VECTOR p); + ChangedDataObjectListImpl(const ChangedDataObjectListImpl &pin); + ChangedDataObjectListImpl(); + + virtual ~ChangedDataObjectListImpl(); + virtual DataObjectPtr operator[] (int pos); + virtual const DataObjectPtr operator[] (int pos) const; + virtual DataObject* get(unsigned int pos); + virtual ChangedDataObjectList::ChangeType getType(unsigned int pos); + + + virtual int size () const; + + virtual void insert (unsigned int index, DataObject *d, ChangedDataObjectList::ChangeType type); + + virtual void append (DataObject* d, ChangedDataObjectList::ChangeType type); + + virtual void clear(); + + virtual void remove (unsigned int index); + + +private: + CHANGEDDATAOBJECT_VECTOR plist; + CHANGEDDATAOBJECT_VECTOR getVec() const; + + void validateIndex(int index) const; +}; +}; +}; +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp new file mode 100644 index 0000000000..9581160044 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp @@ -0,0 +1,264 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/07 08:25:11 $ */ + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/DataObjectImpl.h" + + +#include "commonj/sdo/CopyHelper.h" + +namespace commonj{ +namespace sdo{ + + /** CopyHelper provides static copying helper functions. + * + * CopyHelper provides shallow and deep copy of data objects. + * copyShallow() copies the DataType members of the data object. + * copy() copies all the members and recurses downwards though + * the data graph + */ + + void CopyHelper::transferitem(DataObjectPtr to, DataObjectPtr from, const Property& p) + { + switch (p.getTypeEnum()) + { + case Type::BooleanType: + to->setBoolean( p, from->getBoolean(p)); + break; + case Type::ByteType: + to->setByte( p, from->getByte(p)); + break; + case Type::CharacterType: + to->setCharacter( p, from->getCharacter(p)); + break; + case Type::IntegerType: + to->setInteger( p, from->getInteger(p)); + break; + case Type::ShortType: + to->setShort( p,from->getShort(p)); + break; + case Type::DoubleType: + to->setDouble( p, from->getDouble(p)); + break; + case Type::FloatType: + to->setFloat( p, from->getFloat(p)); + break; + case Type::LongType: + to->setLong( p, from->getLong(p)); + break; + case Type::DateType: + to->setDate( p, from->getDate(p)); + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + unsigned int siz = from->getLength(p); + if (siz > 0) + { + wchar_t * buf = new wchar_t[siz]; + from->getString(p,buf, siz); + to->setString(p, buf, siz); + delete buf; + } + } + break; + case Type::BytesType: + { + unsigned int siz = from->getLength(p); + if (siz > 0) + { + char * buf = new char[siz]; + from->getBytes(p,buf, siz); + to->setBytes(p, buf, siz); + delete buf; + } + } + break; + default: + break; + } // switch + } + + void CopyHelper::transferlist(DataObjectList& to, DataObjectList& from, Type::Types t) + { + for (int i=0;i< from.size(); i++) + { + switch (t) + { + case Type::BooleanType: + to.append(from.getBoolean(i)); + break; + case Type::ByteType: + to.append(from.getByte(i)); + break; + case Type::CharacterType: + to.append(from.getCharacter(i)); + break; +#if __WORDSIZE ==64 + case Type::IntegerType: + to.append((int64_t)(from.getInteger(i))); + break; +#else + case Type::IntegerType: + to.append(from.getInteger(i)); + break; +#endif + case Type::ShortType: + to.append(from.getShort(i)); + break; + case Type::DoubleType: + to.append(from.getDouble(i)); + break; + case Type::FloatType: + to.append(from.getFloat(i)); + break; + case Type::LongType: + to.append(from.getLong(i)); + break; + case Type::DateType: + to.append(from.getDate(i)); + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + unsigned int siz = from.getLength(i); + if (siz > 0) + { + wchar_t * buf = new wchar_t[siz]; + from.getString(i,buf,siz); + to.append(buf,siz); + delete buf; + } + } + break; + + case Type::BytesType: + { + unsigned int siz = from.getLength(i); + if (siz > 0) + { + char * buf = new char[siz]; + from.getBytes(i,buf,siz); + to.append(buf,siz); + delete buf; + } + } + break; + + default: + break; + } // case + } // for + } // method + + /** CopyHelper provides static copying helper functions. + * + * copyShallow() copies the DataType members of the data object. + * copy() copies all the members and recurses downwards though + * the data graph + */ + DataObjectPtr CopyHelper::copyShallow(DataObjectPtr dataObject) + { + return internalCopy(dataObject, false); + + } + + /** CopyHelper provides static copying helper functions. + * + * copyShallow() copies the DataType members of the data object. + * copy() copies all the members and recurses downwards though + * the data graph + */ + DataObjectPtr CopyHelper::copy(DataObjectPtr dataObject) + { + return internalCopy(dataObject, true); + } + + DataObjectPtr CopyHelper::internalCopy(DataObjectPtr dataObject, + bool fullCopy) + { + + DataObject* theob = dataObject; + DataFactoryPtr fac = ((DataObjectImpl*)theob)->getDataFactory(); + if (!fac) return 0; + + const Type& t = dataObject->getType(); + DataObjectPtr newob = fac->create(t); + if (!newob) return 0; + + PropertyList pl = dataObject->getInstanceProperties(); + for (int i=0;i < pl.size(); i++) + { + if (dataObject->isSet(pl[i])) + { + // data objects are only copied in the deep copy case + if (pl[i].getType().isDataObjectType()) + { + if (!fullCopy) + { + continue; + } + else + { + if (pl[i].isMany()) + { + DataObjectList& dolold = dataObject->getList(pl[i]); + DataObjectList& dolnew = newob->getList(pl[i]); + for (int i=0;i< dolold.size(); i++) + { + dolnew.append(internalCopy(dolold[i],true)); + } + } + else + { + DataObjectPtr dob = dataObject->getDataObject(pl[i]); + newob->setDataObject(pl[i],internalCopy(dob,true)); + } + } + } + else + { + if (pl[i].isMany()) + { + DataObjectList& dolold = dataObject->getList(pl[i]); + DataObjectList& dolnew = newob->getList(pl[i]); + transferlist(dolnew,dolold, pl[i].getTypeEnum()); + } + else + { + transferitem(newob,dataObject, pl[i]); + } + } // else + } + } + return newob; + } + + +} +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/CopyHelper.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/CopyHelper.h new file mode 100644 index 0000000000..954333a15b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/CopyHelper.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _COPYHELPER_H_ +#define _COPYHELPER_H_ + + +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/RefCountingPointer.h" + +namespace commonj{ +namespace sdo{ + + /** CopyHelper provides static copying helper functions. + * + * CopyHelper provides shallow and deep copy of data objects. + * copyShallow() copies the DataType members of the data object. + * copy() copies all the members and recurses downwards though + * the data graph + */ + +class CopyHelper +{ + public: + + /** CopyHelper provides static copying helper functions. + * + * CopyHelper provides shallow and deep copy of data objects. + * copyShallow() copies the DataType members of the data object. + * copy() copies all the members and recurses downwards though + * the data graph + */ + static SDO_API DataObjectPtr copyShallow(DataObjectPtr dataObject); + + /** CopyHelper provides static copying helper functions. + * + * CopyHelper provides shallow and deep copy of data objects. + * copyShallow() copies the DataType members of the data object. + * copy() copies all the members and recurses downwards though + * the data graph + */ + static SDO_API DataObjectPtr copy(DataObjectPtr dataObject); + + private: + static void transferlist(DataObjectList& to, DataObjectList& from, Type::Types t); + static void transferitem(DataObjectPtr to, DataObjectPtr from, const Property& p); + static DataObjectPtr internalCopy(DataObjectPtr dataObject, bool fullCopy); + +}; +}; +}; + +#endif //_COPYHELPER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASProperty.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASProperty.cpp new file mode 100644 index 0000000000..ed4dc5f8ba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASProperty.cpp @@ -0,0 +1,32 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/DASProperty.h" + + +namespace commonj{ +namespace sdo{ + + + DASProperty::~DASProperty() + { + } +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASProperty.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASProperty.h new file mode 100644 index 0000000000..9cff3a7967 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASProperty.h @@ -0,0 +1,46 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _DASPROPERTY_H_ +#define _DASPROPERTY_H_ +#include "commonj/sdo/Property.h" +#include "commonj/sdo/DASValues.h" + +#include "commonj/sdo/disable_warn.h" + +namespace commonj{ +namespace sdo{ + +/** + * DASProperty is a class to provide data access services + * with a more flexible Property + */ + + class DASProperty : public Property, public DASValues +{ + public: + + virtual ~DASProperty(); + + + +}; +}; +}; +#endif //_DMSDATAOBJECT_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASType.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASType.cpp new file mode 100644 index 0000000000..d249f1a2f0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASType.cpp @@ -0,0 +1,32 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/DASType.h" + + +namespace commonj{ +namespace sdo{ + + + DASType::~DASType() + { + } +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASType.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASType.h new file mode 100644 index 0000000000..56f0fa2571 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASType.h @@ -0,0 +1,53 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/03/01 08:52:41 $ */ + +#ifndef _DASTYPE_H_ +#define _DASTYPE_H_ + +#include "commonj/sdo/disable_warn.h" + + +#include "commonj/sdo/Type.h" +#include "commonj/sdo/DASValues.h" +namespace commonj{ +namespace sdo{ + +/** + * DASType is a class to provide data access services + * with a more flexible Type + */ + +class DASType : public Type, public DASValues +{ + public: + + virtual ~DASType(); + + + + virtual void setOpen(bool set) = 0; + virtual void setSequenced( bool set) = 0; + virtual void setBaseType( const Type* type, bool isRestriction=false) = 0; + + + +}; +}; +}; +#endif //_DASDATAOBJECT_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValue.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValue.cpp new file mode 100644 index 0000000000..66f493b84e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValue.cpp @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/DASValue.h" + + +namespace commonj +{ + namespace sdo + { + + DASValue::DASValue() + { + } + + DASValue::DASValue(const char* val) + : value(val) + { + } + + DASValue::~DASValue() + { + + } + + const char* DASValue::getValue() const + { + return value.c_str(); + } + + + } +} +// end - namespace sdo + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValue.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValue.h new file mode 100644 index 0000000000..f15a24aae4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValue.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _SDO_DASValue_H_ +#define _SDO_DASValue_H_ + + +#include "commonj/sdo/export.h" +#include "string" + + +namespace commonj +{ + namespace sdo + { + +/** + * DASValue is a class to hold information required by data + * access services but not required by the data factory. + */ + class DASValue + { + public: + SDO_API DASValue(); + SDO_API DASValue(const char* value); + SDO_API virtual ~DASValue(); + SDO_API const char* getValue() const; + + private: + std::string value; + + }; + + } +} +#endif //_SDO_DASValue_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValues.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValues.cpp new file mode 100644 index 0000000000..aac9702cfd --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValues.cpp @@ -0,0 +1,68 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/DASValues.h" + +using namespace std; +namespace commonj +{ + namespace sdo + { + +/** + * DASValues is a class to hold list of information required by data + * access services but not required by the data factory. + */ + + DASValues::~DASValues() + { + DASValue_MAP::iterator propertyIter; + for (propertyIter = properties.begin() ; propertyIter != properties.end() ; ++propertyIter) + { + delete propertyIter->second; + } + } + + void DASValues::setDASValue(const char* name, DASValue* property) + { + DASValue* prop = getDASValue(name); + if (prop != 0 && prop != property) + { + delete prop; + } + properties[name] = property; + } + + DASValue* DASValues::getDASValue(const char* name) + { + DASValue_MAP::iterator propertyIter; + propertyIter = properties.find(name); + if(propertyIter != properties.end()) + { + return propertyIter->second; + } + return NULL; + + } + + } +} +// end - namespace sdo + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValues.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValues.h new file mode 100644 index 0000000000..6c5ba835c3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DASValues.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _SDO_DASValues_H_ +#define _SDO_DASValues_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/export.h" +#include "commonj/sdo/DASValue.h" +#include "map" +#include "string" + + + +namespace commonj +{ + namespace sdo + { + +/** + * DASValues is a class to hold list of information required by data + * access services but not required by the data factory. + */ + + class DASValues + { + public: + SDO_API virtual ~DASValues(); + SDO_API virtual void setDASValue(const char* name, DASValue* value); + SDO_API virtual DASValue* getDASValue(const char* name); + private: + + typedef std::map<std::string, DASValue*> DASValue_MAP; + DASValue_MAP properties; + + }; + + } +} +#endif //_SDO_DASValues_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactory.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactory.cpp new file mode 100644 index 0000000000..026ed5c871 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactory.cpp @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + + +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/DataFactoryImpl.h" + +namespace commonj{ +namespace sdo{ + +/** + * DataFactory holds metadata and creates DataObjects. + * + * The DataFactory holds properties and types loaded from XSD, or + * created using the DataFactory API. + */ + + DataFactory::~DataFactory() + { + } + + RefCountingPointer<DataFactory> DataFactory::getDataFactory() + { + DataFactory* dob = (DataFactory*)(new DataFactoryImpl()); + return RefCountingPointer<DataFactory> (dob); + } + + RefCountingPointer<DataFactory> DataFactory::clone() + { + const DataFactoryImpl* df = (const DataFactoryImpl*)this; + DataFactory* dob = (DataFactory*)(new DataFactoryImpl(*df)); + return RefCountingPointer<DataFactory> (dob); + } + +}; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactory.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactory.h new file mode 100644 index 0000000000..7ee7b1b229 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactory.h @@ -0,0 +1,806 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/07 13:35:33 $ */ + +#ifndef _DATAFACTORY_H_ +#define _DATAFACTORY_H_ + +#include "commonj/sdo/export.h" + +#include "commonj/sdo/TypeList.h" + +#include "commonj/sdo/RefCountingObject.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/SDODate.h" +#include "commonj/sdo/DASValue.h" +#include "commonj/sdo/SDOString.h" + + +namespace commonj{ +namespace sdo{ + +class DataObject; +class Type; + +/** + * DataFactory holds metadata and creates DataObjects. + * + * The DataFactory holds properties and types loaded from XSD, or + * created using the DataFactory API. + */ + +class DataFactory : public RefCountingObject +{ + public: + + + /** + * getDataFactory is static and gets a data factory + * + * Static method to get a new data factory, with a set of base Types defined. + * With the data factory returned, either load Type definitions + * from XSD, or use the DataFactory APIs to define the types. + */ + + static SDO_API DataFactoryPtr getDataFactory(); + + virtual SDO_API ~DataFactory(); + + + /** + * DataFactory::clone copies a data factory + * + * Copy the data factory, and return a new data factory which + * has the same properties and types, but is still able to have + * new types added to it. + */ + + SDO_API virtual DataFactoryPtr clone(); + + /** + * DataFactory::create creates a data object. + * + * Create a data object based on the type specified as a parameter + * Once a data object has been created by this factory, the metadata + * (types and properties) may no longer be altered. + */ + + SDO_API virtual DataObjectPtr create(const char* uri, const char* typeName) = 0; + + SDO_API virtual DataObjectPtr create(const SDOString& uri, const SDOString& typeName) = 0; + + SDO_API virtual DataObjectPtr create(const Type& type) = 0; + + /** + * DataFactory::getType gets a type back from the factory. + * + * Get a type as specified in the data factory. Useful for creating + * data objects or querying properties. + */ + + virtual const Type& getType(const char* uri, const char* inTypeName) const = 0; + + virtual const Type& getType(const SDOString& uri, const SDOString& inTypeName) const = 0; + + + /** + * DataFactory::getTypes gets a list of types back from the factory. + * + * Get all the types available within this data factory. Useful for + * validating whether a data object is of the correct type to be + * usable. + */ + + virtual TypeList getTypes() const = 0; + + /** + * DataFactory::addType adds a type definition. + * + * Add a type defintion to the factory. (Properties may be added later). + * The type is defined by its uri and name. + * -# The type may be sequenced - and therefore work with a sequence API. + * -# The type may be open, indicating that it may have extra properties + * added at runtime. + * -# The type may be abstract, so the data factory will not permit creation + * of instances. + * -# The type may be a data type, indicating that is will not have properties. + * The Type may inherit from another type, but that is specified later with a + * call to setBaseType(). + */ + + + virtual SDO_API void addType(const char* uri, const char* inTypeName, + bool isSequenced = false, + bool isOpen = false, + bool isAbstract = false, + bool isDataType = false) = 0; + + virtual SDO_API void addType(const SDOString& uri, const SDOString& inTypeName, + bool isSequenced = false, + bool isOpen = false, + bool isAbstract = false, + bool isDataType = false) = 0; + + + /** + * DataFactory::setBaseType allows inheritance + * + * The type specified second in the parameters becomes the basetype + * of the first parameter. + * The second type will have all the properties of its baser type, followed + * by any additional properties of its own. The property indices of the properties + * of the subclass will begin at one more than the total number of + * properties of the supertype + * This relationship is fixed when the first data object of any type is + * created by the factory. Up to that point the base type may be changed. + * + */ + + virtual SDO_API void setBaseType( + const Type& type, + const Type& base, + bool isRestriction = false) = 0; + + virtual SDO_API void setBaseType( + const char* typeuri, + const char* typenam, + const char* baseuri, + const char* basename, + bool isRestriction = false) = 0; + + virtual SDO_API void setBaseType( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& baseuri, + const SDOString& basename, + bool isRestriction = false) = 0; + + + /** + * Generate a typesafe interface for a given data factory + * test code. + */ + + virtual SDO_API bool generateInterface(const char* fileroot, + const char *factoryname) = 0; + + virtual SDO_API bool generateInterface(const SDOString& fileroot, + const SDOString& factoryname) = 0; + + + + /** + * DataFactory::setAlias sets an alternative name + * + * A Type may be known to the data factory by several different names. + * This method adds a new name for an existing property. + * + */ + + virtual SDO_API void setAlias(const char* typeuri, + const char* typenam, + const char* alias) = 0; + + virtual SDO_API void setAlias(const SDOString& typeuri, + const SDOString& typenam, + const SDOString& alias) = 0; + + /** + * DataFactory::addPropertyToType adds properties + * + * The various addPropertyToType methods add a property to an + * existing type in the factory, specifying the name of the new property, + * and the type of the new property - which must also be an existing type + * in this factory. + * -# The new property may be many-valued - so it will be a list of values. + * -# The property may be read-only , and may not be altered by user code - + * However the value may be changed by data access service code. + * -# The property may be containment. + * The type of a property may be DataType, or DataObjectType (see Types). + * If the property is a DataType, then the actual value of the property is held + * within the data object containing the property. + * If the property is a DataObjectType, it may be containment, or reference. + * Containment indicates that the value of the property is contained in the + * data object, whilst reference indicates that the property is only a pointer to + * a value somewhere else in the data graph. + * + */ + + + virtual SDO_API void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany, + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const Type& propType, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const Type& propType, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const Type& type, + const char* propname, + const Type& propType, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const Type& type, + const SDOString& propname, + const Type& propType, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const Type& type, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const Type& type, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany , + bool isReadOnly , + bool isContainment ) = 0; + + virtual SDO_API void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const Type& propType, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const Type& propType, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const Type& type, + const char* propname, + const Type& propType, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const Type& type, + const SDOString& propname, + const Type& propType, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const Type& type, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany = false) =0; + + virtual SDO_API void addPropertyToType(const Type& type, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany = false) =0; + + /** + * DataFactory::setOpposite sets an opposite name + * + * NOT IMPLEMENTED. + * + */ + + virtual SDO_API void setOpposite( + const Type& type, + const char* propName, + const Type& oppositetype, + const char* oppositePropName) = 0; + + virtual SDO_API void setOpposite( + const Type& type, + const SDOString& propName, + const Type& oppositetype, + const SDOString& oppositePropName) = 0; + + /** + * DataFactory::setAlias sets a property alias name + * + * A property, like a type, may be known to the factory by several + * names. + */ + + virtual SDO_API void setAlias(const char* typeuri, + const char* typname, + const char* propname, + const char* alias) = 0; + + virtual SDO_API void setAlias(const SDOString& typeuri, + const SDOString& typname, + const SDOString& propname, + const SDOString& alias) = 0; + + /** + * DataFactory::setPropertySubstitute sets a substitute for a property + * + * A property is of a specified type. However this method specifies another type + * which will be accepted by the data factory at runtime as a substitute for this + * property, and will be inserted into the parent data object as though it was + * a value for this property. The substitute name is then used for this property + * as a sort of alias. + * names. + */ + + virtual SDO_API void setPropertySubstitute( + const char* uri, + const char* inTypeName, + const char* propname, + const char* subname, + const char* subTypeUri, + const char* subTypeName) = 0; + + virtual SDO_API void setPropertySubstitute( + const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const SDOString& subname, + const SDOString& subTypeUri, + const SDOString& subTypeName) = 0; + + virtual SDO_API void setPropertySubstitute( + const Type& containertype, + const char* propname, + const char* subname, + const Type& subtype) = 0; + + virtual SDO_API void setPropertySubstitute( + const Type& containertype, + const SDOString& propname, + const SDOString& subname, + const Type& subtype) = 0; + + + /** + * DataFactory::setDefault sets a default value for a property + * + * When querying the value of a property of a data object, that property + * may be set - indicating that a value has been assigned, or unset - indicating that + * no value has yet been assigned. + * If there is no value assigned, then a default value may be returned for that + * property. + * This method allows the data factory to define that default value. + * There is no default value for a DataObjectType. There are overloads for + * each of the primitive DataTypes. + */ + + virtual SDO_API void setDefault( + const Type& t, + const char* propname, + bool b ) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname, + bool b ) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + char c) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + char c) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + wchar_t c) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + wchar_t c) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + char* c) = 0; + +// #pragma message( "GMW: Unimplemented method, writable string parameter" ) +// virtual SDO_API void setDefault( +// const Type& t, +// const SDOString& propname , +// SDOString& c) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + short s) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + short s) = 0; + + +#if __WORDSIZE !=64 + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + long l) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + long l) = 0; +#endif + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + int64_t i) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + int64_t i) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + float f) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + float f) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + long double d) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + long double d) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + const wchar_t* c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + const wchar_t* c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + const char* c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + const SDOString& c, + unsigned int len) = 0; + + + virtual SDO_API void setDefault( + const Type& t, + const char* propname , + const SDODate dat) = 0; + + virtual SDO_API void setDefault( + const Type& t, + const SDOString& propname , + const SDODate dat) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname, + bool b ) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname, + bool b ) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + char c) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + char c) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + wchar_t c) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + wchar_t c) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + char* c) = 0; + +// #pragma message( "GMW: Unimplemented method, writable string parameter" ) +// virtual SDO_API void setDefault( +// const SDOString& typuri, +// const SDOString& typnam, +// const SDOString& propname , +// SDOString& c) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + short s) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + short s) = 0; + + +#if __WORDSIZE !=64 + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + long l) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + long l) = 0; + +#endif + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + int64_t i) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + int64_t i) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + float f) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + float f) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + long double d) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + long double d) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + const wchar_t* c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + const wchar_t* c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + const char* c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + const SDOString& c, + unsigned int len) = 0; + + virtual SDO_API void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + const SDODate dat) = 0; + + virtual SDO_API void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + const SDODate dat) = 0; + + + /** + * DAS values are used by a DAS implementation + */ + + virtual SDO_API void setDASValue( + const Type& type, + const char* name, + DASValue* value) = 0; + + virtual SDO_API void setDASValue( + const Type& type, + const SDOString& name, + DASValue* value) = 0; + + virtual SDO_API void setDASValue( + const char* typeuri, + const char* typenam, + const char* name, + DASValue* value) = 0; + + virtual SDO_API void setDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& name, + DASValue* value) = 0; + + virtual SDO_API DASValue* getDASValue( + const Type& type, + const char* name) const = 0; + + virtual SDO_API DASValue* getDASValue( + const Type& type, + const SDOString& name) const = 0; + + virtual SDO_API DASValue* getDASValue( + const char* typeuri, + const char* typenam, + const char* name) const = 0; + + virtual SDO_API DASValue* getDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& name) const = 0; + + virtual SDO_API void setDASValue( + const Type& type, + const char* propertyName, + const char* name, + DASValue* value) = 0; + + virtual SDO_API void setDASValue( + const Type& type, + const SDOString& propertyName, + const SDOString& name, + DASValue* value) = 0; + + virtual SDO_API void setDASValue( + const char* typeuri, + const char* typenam, + const char* propertyName, + const char* name, + DASValue* value) = 0; + + virtual SDO_API void setDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& propertyName, + const SDOString& name, + DASValue* value) = 0; + + virtual SDO_API DASValue* getDASValue( + const Type& type, + const char* propertyName, + const char* name) const = 0; + + virtual SDO_API DASValue* getDASValue( + const Type& type, + const SDOString& propertyName, + const SDOString& name) const = 0; + + virtual SDO_API DASValue* getDASValue( + const char* typeuri, + const char* typenam, + const char* propertyName, + const char* name) const = 0; + + virtual SDO_API DASValue* getDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& propertyName, + const SDOString& name) const = 0; + + virtual void resolve() = 0; + + }; +}; +}; +#endif //_DATAFACTORY_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp new file mode 100644 index 0000000000..d3cb033c6e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp @@ -0,0 +1,2271 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/13 08:35:04 $ */ + +////////////////////////////////////////////////////////////////////// +// 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/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"); + + rootElementName.erase(); + + + +} + +// =================================================================== +// Destructor +// =================================================================== +DataFactoryImpl::~DataFactoryImpl() +{ + + TYPES_MAP::iterator typeIter; + for (typeIter = types.begin() ; typeIter != types.end() ; ++typeIter) + { + if (strncmp((typeIter->first).c_str(),"ALIAS::", 7)) + { + delete typeIter->second; + } + } + + rootElementName.erase(); + +} + +// =================================================================== +// get the root element name +// =================================================================== +// const char* DataFactoryImpl::getRootElementName() const +const SDOString& DataFactoryImpl::getRootElementName() const +{ + return rootElementName; +} + +// =================================================================== +// set the root element name +// =================================================================== +void DataFactoryImpl::setRootElementName(const char* ren) +{ + + // If the incoming string is meaningful then use it to reset the stored + // value. Otherwise, just erase what we have. + + if (ren != 0 && (strlen(ren) != 0)) + { + rootElementName = ren; + } + else + { + rootElementName.erase(); + } + +} + +void DataFactoryImpl::setRootElementName(const SDOString& ren) +{ + rootElementName = ren; +} + +// =================================================================== +// copy constructor +// =================================================================== +DataFactoryImpl::DataFactoryImpl(const DataFactoryImpl& inmdg) +{ + isResolved = false; + setRootElementName(inmdg.getRootElementName()); + copyTypes(inmdg); +} + +// =================================================================== +// Assignment operator +// =================================================================== +DataFactoryImpl& DataFactoryImpl::operator=(const DataFactoryImpl& inmdg) +{ + if (this != &inmdg) + { + copyTypes(inmdg); + setRootElementName(inmdg.getRootElementName()); + } + return *this; +} + +// =================================================================== +// copy Types to this DataFactory +// =================================================================== +void DataFactoryImpl::copyTypes(const DataFactoryImpl& inmdg) +{ + + if (isResolved) + { + SDO_THROW_EXCEPTION("copyTypes", + SDOUnsupportedOperationException, "Copying Type after data graph completed"); + } + + TYPES_MAP::const_iterator typeIter; + TYPES_MAP::iterator typeIter2; + char* 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. + fullTypeName = getFullTypeName( + (typeIter->second)->getURI(), + (typeIter->second)->getName()); + typeIter2 = types.find(fullTypeName); + if (fullTypeName)delete fullTypeName; + + // copy the aliases , if there are any. + + if ((typeIter->second)->getAliasCount() > 0) + { + for (int j=0;j<(typeIter->second)->getAliasCount();j++) + { + (typeIter2->second)->setAlias( + (typeIter->second)->getAlias()); + } + } + + + // Now add all the properties + PropertyList props = typeIter->second->getProperties(); + for (int i=0; i < props.size(); i++) + { + // Ensure the properties type is added + const Type& propType = props[i].getType(); + addType(propType.getURI(), propType.getName()); + + // Now add the property + addPropertyToType((typeIter->second)->getURI(), + (typeIter->second)->getName(), + props[i].getName(), + propType.getURI(), + propType.getName(), + props[i].isMany(), + props[i].isReadOnly(), + props[i].isContainment()); + + // copy the aliases if there are any. + if (props[i].getAliasCount() > 0) + { + + PropertyImpl* p = (typeIter2->second)-> + getPropertyImpl(props[i].getName()); + if (p != 0) + { + for (int j=0;j<p->getAliasCount();j++) + { + p->setAlias(props[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); +} + +void DataFactoryImpl::addType(const char* uri, const char* inTypeName, + bool isSeq, + bool isOp, + bool isAbs, + bool isData, + bool isFromList) +{ + + + if (isResolved) + { + SDO_THROW_EXCEPTION("DataFactory::addType", + SDOUnsupportedOperationException, "Adding Type after data graph completed"); + } + + if (inTypeName == 0 || strlen(inTypeName) == 0) + { + SDO_THROW_EXCEPTION("DataFactory::addType", + SDOIllegalArgumentException, " Type has empty name"); + } + + + if (findType(uri, inTypeName) == 0) + { + char* fullTypeName = getFullTypeName(uri, inTypeName); + types[fullTypeName] = new TypeImpl(uri, inTypeName, isSeq, isOp, isAbs, isData, isFromList); + if (fullTypeName)delete 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; + } + + PropertyList pl = cs->getProperties(); + + for (int i=0 ; i < pl.size() ; i++ ) + { + if (recursiveCheck((TypeImpl*)&(pl[i].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 (isResolved) + { + SDO_THROW_EXCEPTION("DataFactory::addChangeSummary", + SDOUnsupportedOperationException, "Adding Change Summary after data graph completed"); + } + + if (cstypes.size() > 0) { + for (int i = 0 ;i < cstypes.size(); i++) + { + if (recursiveCheck(cstypes[i], t)) + { + return false; + + } + } + } + cstypes.push_back(t); + return true; +} + +// =================================================================== +// 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) +{ + char* fullPropTypeName = getFullTypeName(propTypeUri, propTypeName); + TYPES_MAP::iterator typeIter; + typeIter = types.find(fullPropTypeName); + if (fullPropTypeName)delete 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) +{ + if (isResolved) + { + SDO_THROW_EXCEPTION("DataFactory::addPropertyToType", + SDOUnsupportedOperationException, "Adding Properties after data graph completed"); + } + + + + TYPES_MAP::iterator typeIter, typeIter2; + + //cout << "Adding property " << propname << "(" << propTypeUri << "#" << propTypeName + // << ") to type " << uri << "#" << inTypeName << endl; + + + char* fullTypeName = getFullTypeName(uri, inTypeName); + typeIter = types.find(fullTypeName); + if (fullTypeName)delete 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()); + } + + fullTypeName = getFullTypeName(propTypeUri, propTypeName); + typeIter2 = types.find(fullTypeName); + if (fullTypeName)delete 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 + } +*/ + ((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 +// =================================================================== +char* DataFactoryImpl::getFullTypeName(const char* uri, const char* inTypeName) const +{ + char* c; + if (uri != 0 && inTypeName != 0) + { + c = new char[strlen(uri) + strlen(inTypeName) + 2]; + sprintf(c,"%s#%s",uri,inTypeName); + return c; + } + if (uri != 0) + { + c = new char[strlen(uri) + 2]; + sprintf(c,"%s#",uri); + return c; + } + c = new char[strlen(inTypeName) + 2]; + sprintf(c,"#%s",inTypeName); + return c; +} + +char* DataFactoryImpl::getFullTypeName(const SDOString& uri, const SDOString& inTypeName) const +{ + return getFullTypeName(uri.c_str(), inTypeName.c_str()); +} + +// =================================================================== +// getFullTypeName - return the name used as a key in the types map +// =================================================================== +char* DataFactoryImpl::getAliasTypeName(const char* uri, const char* inTypeName) const +{ + char* c; + if (uri != 0 && inTypeName != 0) + { + c = new char[strlen(uri) + strlen(inTypeName) + 9]; + sprintf(c,"ALIAS::%s#%s",uri,inTypeName); + return c; + } + if (uri != 0) + { + c = new char[strlen(uri) + 9]; + sprintf(c,"ALIAS::%s#",uri); + return c; + } + c = new char[strlen(inTypeName) + 9]; + sprintf(c,"ALIAS::#%s",inTypeName); + return c; +} + +char* DataFactoryImpl::getAliasTypeName(const SDOString& uri, const SDOString& inTypeName) const +{ + return getAliasTypeName(uri.c_str(), inTypeName.c_str()); +} + +// =================================================================== +// 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; + + char* fullTypeName = getFullTypeName(typeuri, typenam); + typeIter = types.find(fullTypeName); + if (fullTypeName)delete 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); + } + +// #pragma message( "GMW: Unimplemented method, writable string parameter" ) +// void DataFactoryImpl::setDefault( +// const Type& t, const SDOString& propname , SDOString& c) +// { +// setDefault(t.getURI(), t.getName(), propname.c_str(), c.c_str()); +// } + + 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); + } + +// #pragma message( "GMW: Unimplemented method, writable string parameter" ) +// void DataFactoryImpl::setDefault( +// const SDOString& typuri, const SDOString& typnam, +// const SDOString& propname , SDOString& c) +// { +// setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), c.c_str()); +// } + + 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 char* uri, const char* inTypeName) const +{ + const TypeImpl* type = findTypeImpl(uri, inTypeName); + + if (type == 0) + { + string msg("Type not found :"); + if (uri != 0)msg += uri; + msg += " "; + if (inTypeName != 0)msg += inTypeName; + SDO_THROW_EXCEPTION("getTypeImpl" , + SDOTypeNotFoundException, msg.c_str()); + } + + return *type; +} + +const TypeImpl& DataFactoryImpl::getTypeImpl(const SDOString& uri, const SDOString& inTypeName) const +{ + return getTypeImpl(uri.c_str(), inTypeName.c_str()); +} + +// =================================================================== +// findType +// =================================================================== + +const Type* DataFactoryImpl::findType(const char* uri, const char* inTypeName) const +{ + return (Type*)findTypeImpl(uri,inTypeName); +} + +const Type* DataFactoryImpl::findType(const SDOString uri, const SDOString inTypeName) const +{ + return (Type*) findTypeImpl(uri.c_str(), inTypeName.c_str()); +} + +// =================================================================== +// findTypeImpl +// =================================================================== + +const TypeImpl* DataFactoryImpl::findTypeImpl(const SDOString& uri, const SDOString& inTypeName) const +{ + return findTypeImpl(uri.c_str(), inTypeName.c_str()); +} + +const TypeImpl* DataFactoryImpl::findTypeImpl(const char* uri, const char* inTypeName) const +{ + char* fullTypeName = getFullTypeName(uri, inTypeName); + TYPES_MAP::const_iterator typeIter; + typeIter = types.find(fullTypeName); + if (fullTypeName)delete fullTypeName; + if(typeIter != types.end()) + { + return typeIter->second; + } + else + { + // try alias names + fullTypeName = getAliasTypeName(uri, inTypeName); + typeIter = types.find(fullTypeName); + if (fullTypeName)delete 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) +{ + + char* fullTypeName = getFullTypeName(typeuri, typenam); + TYPES_MAP::iterator typeIter; + typeIter = types.find(fullTypeName); + if (fullTypeName)delete fullTypeName; + if(typeIter != types.end()) + { + (typeIter->second)->setAlias(alias); + fullTypeName = getAliasTypeName(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() +{ + if (isResolved) return; + + TYPES_MAP::iterator typeIter; + for (typeIter = types.begin() ; typeIter != types.end(); + ++typeIter) + { + (typeIter->second)->initCompoundProperties(); + (typeIter->second)->validateChangeSummary(); + } + + isResolved = true; +} + +// =================================================================== +// 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) +{ + + if (!isResolved) + { + // 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) + { + removeOpenProperty(name.c_str()); + } + void DataFactoryImpl::removeOpenProperty(const char* name) + { + propertyMap::iterator i = + openProperties.find(name); + 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::compareTypes(const TypeImpl* t1, const Type& t2) +{ + PropertyList pl = t2.getProperties(); + for (int i=0;i<pl.size();i++) + { + PropertyImpl* p = t1->getPropertyImpl(i); + if (p == 0) return false; + if (p->isMany() != pl[i].isMany()) return false; + if (p->isContainment() != pl[i].isContainment()) return false; + if (strcmp( p->getType().getURI(), + pl[i].getType().getURI())) return false; + if (strcmp( p->getType().getName(), + pl[i].getType().getName())) return false; + } + return true; + +} +bool DataFactoryImpl::checkType(const Type& t) +{ + const TypeImpl* t2 = findTypeImpl(t.getURI(), + t.getName()); + + if (t2 == 0) return false; + + if (!compareTypes(t2,t)) return false; + + PropertyList pl = t.getProperties(); + for (int i=0;i<pl.size();i++) + { + if (pl[i].getType().isDataObjectType()) + { + if (!checkType(pl[i].getType())) return false; + } + } + return true; +} + + +// only checks the tree dirctly descended from this object if the +// object is specified, otherwise validates the whole factory + +bool DataFactoryImpl::isCompatible(DataFactory* df, DataObject* d) +{ + if (d == 0) + { + TypeList tl = df->getTypes(); + for (int j=0;j<tl.size();j++) + { + const TypeImpl* t = findTypeImpl(tl[j].getURI(), + tl[j].getName()); + + if (t == 0) return false; + if (!compareTypes(t,tl[j]))return false; + } + return true; + } + else + { + return checkType(d->getType()); + } +} + +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"); + + 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 (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 (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()); +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.h new file mode 100644 index 0000000000..046160bc71 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.h @@ -0,0 +1,716 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/13 08:35:04 $ */ + +#ifndef _DataFactoryIMPL_H_ +#define _DataFactoryIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/TypeImpl.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/PropertyImpl.h" +#include "commonj/sdo/SDOXMLString.h" + + +#include <map> + + + +namespace commonj{ +namespace sdo{ + + typedef std::map<std::string, PropertyImpl> propertyMap; + +/** + * DataFactoryImpl implements the abstract class DataFactory. + * DataFactoryImpl holds metadata and creates DataObjects. + * + * The DataFactory holds properties and types loaded from XSD, or + * created using the DataFactory API. + */ +class DataFactoryImpl : public DataFactory +{ +public: + DataFactoryImpl(); + virtual ~DataFactoryImpl(); + + DataFactoryImpl(const DataFactoryImpl& inmdg); + DataFactoryImpl& operator=(const DataFactoryImpl& inmdg); + + virtual void addType(const char* uri, const char* inTypeName, + bool isSeqenced = false, + bool isOpen = false, + bool isAbstract = false, + bool isDataType = false + ); + + virtual void addType(const SDOString& uri, const SDOString& inTypeName, + bool isSeqenced = false, + bool isOpen = false, + bool isAbstract = false, + bool isDataType = false + ); + + virtual void addType(const char* uri, const char* inTypeName, + bool isSeqenced , + bool isOpen , + bool isAbstract , + bool isDataType , + bool isFromList ); + + virtual void addType(const SDOString& uri, const SDOString& inTypeName, + bool isSeqenced , + bool isOpen , + bool isAbstract , + bool isDataType , + bool isFromList ); + + virtual void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany = false); + + virtual void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany = false); + + virtual void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const Type& propType, + bool isMany = false); + + virtual void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const Type& propType, + bool isMany = false); + + virtual void addPropertyToType(const Type& type, + const char* propname, + const Type& propType, + bool isMany = false); + + virtual void addPropertyToType(const Type& type, + const SDOString& propname, + const Type& propType, + bool isMany = false); + + virtual void addPropertyToType(const Type& type, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany = false); + + virtual void addPropertyToType(const Type& type, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany = false); + + virtual void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany , + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany , + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const char* uri, + const char* inTypeName, + const char* propname, + const Type& propType, + bool isMany, + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const Type& propType, + bool isMany, + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const Type& type, + const char* propname, + const Type& propType, + bool isMany, + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const Type& type, + const SDOString& propname, + const Type& propType, + bool isMany, + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const Type& type, + const char* propname, + const char* propTypeUri, + const char* propTypeName, + bool isMany, + bool isReadOnly, + bool isContainment); + + virtual void addPropertyToType(const Type& type, + const SDOString& propname, + const SDOString& propTypeUri, + const SDOString& propTypeName, + bool isMany, + bool isReadOnly, + bool isContainment); + + + virtual void setBaseType( const Type& type, + const Type& base, + bool isRestriction = false); + + virtual void setBaseType( const char* typeuri, + const char* typenam, + const char* baseuri, + const char* basename, + bool isRestriction = false); + + virtual void setBaseType( const SDOString& typeuri, + const SDOString& typenam, + const SDOString& baseuri, + const SDOString& basename, + bool isRestriction = false); + + virtual const Type& getType(const char* uri, const char* inTypeName) const; + + virtual const Type& getType(const SDOString& uri, const SDOString& inTypeName) const; + + virtual TypeList getTypes() const; + + virtual DataObjectPtr create(const char* uri, const char* typeName) ; + + virtual DataObjectPtr create(const SDOString& uri, const SDOString& typeName) ; + + virtual DataObjectPtr create(const Type& type) ; + + virtual void setAlias(const char* typeuri, + const char* typenam, + const char* alias) ; + + virtual void setAlias(const SDOString& typeuri, + const SDOString& typenam, + const SDOString& alias) ; + + virtual void setAlias(const char* typeuri, + const char* typname, + const char* propname, + const char* alias) ; + + virtual void setAlias(const SDOString& typeuri, + const SDOString& typname, + const SDOString& propname, + const SDOString& alias) ; + + virtual void setOpposite (const Type& type, + const char* propname, + const Type& opptype, + const char* opppropname) ; + + virtual void setOpposite (const Type& type, + const SDOString& propname, + const Type& opptype, + const SDOString& opppropname) ; + + + virtual void setPropertySubstitute( + const char* uri, + const char* inTypeName, + const char* propname, + const char* subname, + const char* subTypeUri, + const char* subTypeName); + + virtual void setPropertySubstitute( + const SDOString& uri, + const SDOString& inTypeName, + const SDOString& propname, + const SDOString& subname, + const SDOString& subTypeUri, + const SDOString& subTypeName); + + virtual void setPropertySubstitute( + const Type& containertype, + const char* propname, + const char* subname, + const Type& subtype); + + virtual void setPropertySubstitute( + const Type& containertype, + const SDOString& propname, + const SDOString& subname, + const Type& subtype); + + //////////////////////////////////////////////////////// + virtual void setDefault( + const Type& t, + const char* propname, + bool b ) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname, + bool b ) ; + + virtual void setDefault( + const Type& t, + const char* propname , + char c) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + char c) ; + + virtual void setDefault( + const Type& t, + const char* propname , + wchar_t c) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + wchar_t c) ; + + virtual void setDefault( + const Type& t, + const char* propname , + char* c) ; + +// #pragma message( "GMW: Unimplemented method, writable string parameter" ) +// virtual void setDefault( +// const Type& t, +// const SDOString& propname , +// SDOString& c) ; + + virtual void setDefault( + const Type& t, + const char* propname , + short s) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + short s) ; + + + +#if __WORDSIZE !=64 + virtual void setDefault( + const Type& t, + const char* propname , + long l) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + long l) ; + +#endif + + virtual void setDefault( + const Type& t, + const char* propname , + int64_t i) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + int64_t i) ; + + virtual void setDefault( + const Type& t, + const char* propname , + float f) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + float f) ; + + virtual void setDefault( + const Type& t, + const char* propname , + long double d) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + long double d) ; + + virtual void setDefault( + const Type& t, + const char* propname , + const SDODate d) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + const SDODate d) ; + + virtual void setDefault( + const Type& t, + const char* propname , + const wchar_t* c, + unsigned int len) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + const wchar_t* c, + unsigned int len) ; + + virtual void setDefault( + const Type& t, + const char* propname , + const char* c, + unsigned int len) ; + + virtual void setDefault( + const Type& t, + const SDOString& propname , + const SDOString& c, + unsigned int len) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname, + bool b ) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname, + bool b ) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + char c) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + char c) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + wchar_t c) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + wchar_t c) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + char* c) ; + +// #pragma message( "GMW: Unimplemented method, writable string parameter" ) +// virtual void setDefault( +// const SDOString& typuri, +// const SDOString& typnam, +// const SDOString& propname , +// SDOString& c) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + short s) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + short s) ; + +#if __WORDSIZE !=64 + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + long l) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + long l) ; + +#endif + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + int64_t i) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + int64_t i) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + float f) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + float f) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + long double d) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + long double d) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + const SDODate d) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + const SDODate d) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + const wchar_t* c, + unsigned int len) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + const wchar_t* c, + unsigned int len) ; + + virtual void setDefault( + const char* typuri, + const char* typnam, + const char* propname , + const char* c, + unsigned int len) ; + + virtual void setDefault( + const SDOString& typuri, + const SDOString& typnam, + const SDOString& propname , + const SDOString& c, + unsigned int len) ; + + virtual void setDASValue( + const Type& type, + const char* name, + DASValue* value); + + virtual void setDASValue( + const Type& type, + const SDOString& name, + DASValue* value); + + virtual void setDASValue( + const char* typeuri, + const char* typenam, + const char* name, + DASValue* value); + + virtual void setDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& name, + DASValue* value); + + virtual DASValue* getDASValue( + const Type& type, + const char* name) const; + + virtual DASValue* getDASValue( + const Type& type, + const SDOString& name) const; + + virtual DASValue* getDASValue( + const char* typeuri, + const char* typenam, + const char* name) const; + + virtual DASValue* getDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& name) const; + + virtual void setDASValue( + const Type& type, + const char* propertyName, + const char* name, + DASValue* value); + + virtual void setDASValue( + const Type& type, + const SDOString& propertyName, + const SDOString& name, + DASValue* value); + + virtual void setDASValue( + const char* typeuri, + const char* typenam, + const char* propertyName, + const char* name, + DASValue* value); + + virtual void setDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& propertyName, + const SDOString& name, + DASValue* value); + + virtual DASValue* getDASValue( + const Type& type, + const char* propertyName, + const char* name) const; + + virtual DASValue* getDASValue( + const Type& type, + const SDOString& propertyName, + const SDOString& name) const; + + virtual DASValue* getDASValue( + const char* typeuri, + const char* typenam, + const char* propertyName, + const char* name) const; + + virtual DASValue* getDASValue( + const SDOString& typeuri, + const SDOString& typenam, + const SDOString& propertyName, + const SDOString& name) const; + + virtual void resolve(); + +// TODO: Remove char* form of method since it is not exposed to users + const Type* findType (const char* uri, const char* inTypeName) const; + const Type* findType(const SDOString uri, const SDOString inTypeName) const; + +// TODO: Remove char* form of method since it is not exposed to users + const TypeImpl* findTypeImpl (const char* uri, const char* inTypeName) const; + const TypeImpl* findTypeImpl(const SDOString& uri, const SDOString& inTypeName) const; + + void addOpenProperty(const PropertyImpl& prop); +// TODO: Remove char* form of method since it is not exposed to users + void removeOpenProperty(const char* name); + void removeOpenProperty(const SDOString& name); + const propertyMap& getOpenProperties(); +// TODO: Remove char* form of method since it is not exposed to users + virtual const TypeImpl& getTypeImpl(const char* uri, const char* inTypeName) const; + virtual const TypeImpl& getTypeImpl(const SDOString& uri, const SDOString& inTypeName) const; + virtual const SDOString& getRootElementName() const; +// TODO: Remove char* form of method since it is not exposed to users + virtual void setRootElementName(const char* ren); + virtual void setRootElementName(const SDOString& ren); + virtual bool checkType(const Type& t); + virtual bool isCompatible(DataFactory* df, DataObject* d); + virtual bool compareTypes(const TypeImpl* t1, const Type& t2); + + virtual bool generateInterface(const char* fileroot, const char* factoryname); + + virtual bool generateInterface(const SDOString& fileroot, const SDOString& factoryname); + +private: + typedef std::map<std::string, TypeImpl*> TYPES_MAP; + TYPES_MAP types; + + std::vector<DataFactory*> compatibleFactories; + + SDOString rootElementName; + + propertyMap openProperties; + + // Need to validate and 'lock' the data model for base types to + // work properly. + + bool isResolved; + + bool recursiveCheck(TypeImpl* cs, TypeImpl* t); + bool checkForValidChangeSummary(TypeImpl* t); + + typedef std::vector<TypeImpl*> TYPES_VECTOR; + TYPES_VECTOR cstypes; + +// TODO: Remove char* form of method since it is not exposed to users + char* getFullTypeName(const char* uri, const char* inTypeName) const; + char* getFullTypeName(const SDOString& uri, const SDOString& inTypeName) const; +// TODO: Remove char* form of method since it is not exposed to users + char* getAliasTypeName(const char* uri, const char* inTypeName) const; + char* getAliasTypeName(const SDOString& uri, const SDOString& inTypeName) const; + + void copyTypes(const DataFactoryImpl& inmdg); +}; +}; +}; +#endif // _DataFactoryIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraph.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraph.cpp new file mode 100644 index 0000000000..a367853f06 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraph.cpp @@ -0,0 +1,33 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/disable_warn.h" +#include "commonj/sdo/DataGraph.h" +#include "commonj/sdo/SDORuntimeException.h" + +namespace commonj{ + namespace sdo { + + DataGraph::~DataGraph() + { + } + + + }; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraph.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraph.h new file mode 100644 index 0000000000..715223992a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraph.h @@ -0,0 +1,99 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _DATAGRAPH_H_ +#define _DATAGRAPH_H_ + +#include "commonj/sdo/RefCountingObject.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/export.h" +#include "commonj/sdo/DataObject.h" + + +namespace commonj{ +namespace sdo{ + +/** + * DataGraph holds a whole graph of data objects, starting from + * a single root. This class is not currently used in the C++ + * implementation, but will be required by DAS implementations. + */ + +class DataGraph : public RefCountingObject +{ + public: + virtual ~DataGraph(); + + /** + * + * Gets the root data object of this graph. + */ + + + virtual SDO_API DataObjectPtr getRootObject() = 0; + + /** + * + * gets the name of the element from which the root + * object was loaded (The XML definition). + */ + virtual SDO_API const char* getRootElementName() = 0; + + /** + * Sets the Root data object. + * + */ + virtual SDO_API void setRootObject(DataObjectPtr dob) = 0; + + /** + * Creates a root data object - used by DAS implementations. + * + */ + + virtual SDO_API DataObjectPtr createRootObject(const char* uri, + const char* name) = 0; + + /** + * Creates a root data object - used by DAS implementations. + * + */ + + virtual SDO_API DataObjectPtr createRootObject(const Type& t) = 0; + + /** + * Gets the change summary if there is one. + * + */ + + virtual SDO_API ChangeSummaryPtr getChangeSummary() = 0; + + /** + * Gets a type from the data factory. + * + */ + + virtual SDO_API const Type& getType(const char* uri, + const char* name) = 0; + + +}; +}; +}; + +#endif //_DATAGRAPH_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraphImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraphImpl.cpp new file mode 100644 index 0000000000..636dbed25f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraphImpl.cpp @@ -0,0 +1,117 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/DataGraphImpl.h" +#include "commonj/sdo/DataObjectImpl.h" +#include "commonj/sdo/SDORuntimeException.h" + + + +namespace commonj{ + namespace sdo { + +/** + * DataGraphImpl implements DataGraph. + * DataGraph holds a whole graph of data objects, starting from + * a single root. This class is not currently used in the C++ + * implementation, but will be required by DAS implementations. + */ + DataGraphImpl::~DataGraphImpl() + { + } + + DataGraphImpl::DataGraphImpl(DataFactoryPtr fac) + { + factory = fac; + root = 0; + } + + + DataObjectPtr DataGraphImpl::getRootObject() + { + return root; + } + + const char* DataGraphImpl::getRootElementName() + { + if (root == 0) return 0; + return root->getInstanceProperties()[0].getName(); + } + + void DataGraphImpl::setRootObject(DataObjectPtr dob) + { + if (root != 0) + { + SDO_THROW_EXCEPTION("setRootObject",SDOUnsupportedOperationException, + "Root data object already exists"); + } + root = dob; + } + + + DataObjectPtr DataGraphImpl::createRootObject(const char* uri, + const char* name) + { + if (root != 0) + { + SDO_THROW_EXCEPTION("createRootObject",SDOUnsupportedOperationException, + "Root data object already exists"); + } + root = factory->create(uri,name); + if (root->getInstanceProperties()[0].getType().isDataType()) + { + SDO_THROW_EXCEPTION("createRootObject",SDOUnsupportedOperationException, + "Root data object cannot have a datatype property at element 0"); + } + return root; + } + + + DataObjectPtr DataGraphImpl::createRootObject(const Type& t) + { + if (root != 0) + { + SDO_THROW_EXCEPTION("createRootObject",SDOUnsupportedOperationException, + "Root data object already exists"); + } + root = factory->create(t); + if (root->getInstanceProperties()[0].getType().isDataType()) + { + SDO_THROW_EXCEPTION("createRootObject",SDOUnsupportedOperationException, + "Root data object cannot have a datatype property at element 0"); + } + return root; + } + + + ChangeSummaryPtr DataGraphImpl::getChangeSummary() + { + if (!root) return 0; + return root->getChangeSummary(); + } + + + const Type& DataGraphImpl::getType(const char* uri, + const char* name) + { + return factory->getType(uri,name); + } + + }; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraphImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraphImpl.h new file mode 100644 index 0000000000..15cc994171 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataGraphImpl.h @@ -0,0 +1,106 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#ifndef _DATAGRAPHIMPL_H_ +#define _DATAGRAPHIMPL_H_ +#include "commonj/sdo/export.h" +#include "commonj/sdo/DataGraph.h" +#include "commonj/sdo/disable_warn.h" + + +namespace commonj{ +namespace sdo{ + +/** + * DataGraphImpl implements the abstract class DataGraph. + * DataGraph holds a whole graph of data objects, starting from + * a single root. This class is not currently used in the C++ + * implementation, but will be required by DAS implementations. + */ + +class DataGraphImpl : public DataGraph +{ + public: + virtual ~DataGraphImpl(); + + SDO_API DataGraphImpl(DataFactoryPtr fac); + + /** + * Sets the root data object. + * + */ + + virtual SDO_API void setRootObject(DataObjectPtr dob); + + /** + * Gets the root data object. + * + */ + + virtual DataObjectPtr getRootObject(); + + /** + * Gets the name of the root data element (from the XML + * description). + * + */ + + virtual const char* getRootElementName(); + + /** + * Creates the root data object - for use by DAS implementations + * + */ + + virtual DataObjectPtr createRootObject(const char* uri, + const char* name); + + /** + * Creates the root data object - for use by DAS implementations + * + */ + + + virtual DataObjectPtr createRootObject(const Type& t); + + /** + * + * Gets the change summary if there is one. + */ + + virtual ChangeSummaryPtr getChangeSummary(); + + /** + * + * Gets a type from the data factory. + */ + + virtual const Type& getType(const char* uri, + const char* name); + + private: + + DataFactoryPtr factory; + DataObjectPtr root; + +}; +}; +}; + +#endif //_DATAGRAPHIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObject.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObject.cpp new file mode 100644 index 0000000000..190da0649e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObject.cpp @@ -0,0 +1,31 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:14 $ */ + +#include "commonj/sdo/DataObject.h" + +namespace commonj{ +namespace sdo{ + + + DataObject::~DataObject() + { + } +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObject.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObject.h new file mode 100644 index 0000000000..0e538b27ab --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObject.h @@ -0,0 +1,550 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/02 16:41:30 $ */ + +#ifndef _DATAOBJECT_H_ +#define _DATAOBJECT_H_ +#include "commonj/sdo/export.h" + + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/DataObjectList.h" +#include "commonj/sdo/PropertyList.h" + + +namespace commonj{ +namespace sdo{ + +class DataGraph; +class DataObjectList; +class DataFactory; +class ChangeSummary; + + + /** + * DataObjects are the non-primitive members of a Data graph. + *<p> + * A data object is a representation of some structured data. + * it is the fundamental component in the SDO (Service Data Objects) package. + * Data objects support reflection, path-based accesss, convenience creation + * and deletion methods,and the ability to be part of a data graph. + * Each data object holds its data as a series of properties. + * Properties can be accessed by name, property index, or using the property + * meta object itself. + * <p> + * A data object can also contain references to other data objects, through + * reference-type properties. + * <p> + * A data object has a series of convenience accessors for its properties. + * These methods either use a path (String), a property index, + * or the property's meta object itself, to identify the property. + * Some examples of the path-based accessors are as follows: + * <p> + * DataObjectPtr company = ...;<br> + * company->getString("name");<br> + * company->setString("name", "acme");<br> + * company->getString("department.0/name")<br> + * company->getString("department[1]/name")<br> + * (Note .n indexes from 0, whilst [] indexes from 1.<br> + * company->getDataObject("department[number=123]") returns the department where number=123<br> + * company->getDataObject("..") returns the containing data object<br> + * company->getDataObject("/") returns the root containing data object<br> + * There are specific accessors for the primitive types and commonly used + * data types like String. + */ + +class DataObject : public RefCountingObject +{ + public: + virtual ~DataObject(); + + /** + * + * Introspection - properties and types + */ + + /** getPropertyIndex gets the unique index of a property + * + * A property of a data object has a unique index associated with it. + * This method gets a property index for this object from the property, + * or throw SDOPropertyNotFoundException if the property is not part + * of this data object. + */ + + virtual unsigned int SDO_API getPropertyIndex(const Property& p) = 0; + + + /** getInstanceProperties gets the props of the current object. + * + * Returns a read-only List of the Properties currently used in this DataObject. + * This list will contain all of the properties in getType().getProperties() + * and any properties where isSet(property) is true. + * For example, properties resulting from the use of + * open or mixed XML content are present if allowed by the Type. + * The list does not contain duplicates. + * The order of the properties in the list begins with getType().getProperties() + * and the order of the remaining properties is determined by the implementation. + * The same list will be returned unless the DataObject is updated so that + * the contents of the list change + * Returns the list of Properties currently used in this DataObject. + */ + + virtual SDO_API PropertyList getInstanceProperties() = 0; + + /** + * See if the property currently exists + */ + + virtual SDO_API bool hasProperty(const char* name) = 0; + virtual SDO_API bool hasProperty(const SDOString& name) = 0; + /** + * These are just like getType().getProperty(), but may return + * values other than the property list for open types. + */ + + virtual const Property& getProperty(unsigned int index) = 0; + + virtual const Property& getProperty(const char* prop) = 0; + virtual const Property& getProperty(const SDOString& prop) = 0; + + + /** + * return the data factory which created this object + */ + + virtual SDO_API DataFactory* getDataFactory() = 0; + + /** getContainer get the containing object + * + * Returns the containing data object + * or 0 if there is no container. + */ + + virtual SDO_API DataObjectPtr getContainer() = 0; + + /** getContainmentProperty returns the property containing this object + * + * Return the Property of the data object containing this data object + * or throw an SDOPropertyNotFoundException if there is no container. + */ + + virtual SDO_API const Property& getContainmentProperty() = 0; + + /** getType returns the data object's type. + * + * getType returns the data object's type. + * The type defines the properties available for reflective access. + */ + + virtual SDO_API const Type& getType() = 0; + + /* getTypeEnum returns an enumerator for the type + * + * Returns an enumerator for the type for easy switching on basic types. + * The enumerator is part of the Type class + */ + + virtual SDO_API const Type::Types getTypeEnum() = 0; + + + + + + /** getDataObject returns a data object by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API DataObjectPtr getDataObject(const SDOString& path) = 0; + virtual SDO_API DataObjectPtr getDataObject(const char* path) = 0; + virtual SDO_API DataObjectPtr getDataObject(unsigned int propertyIndex) = 0; + virtual SDO_API DataObjectPtr getDataObject(const Property& property) = 0; + + /** setDataObject sets a value by path, index or property + * + * Sets a property of either this object or an object reachable from it, + * as identified by the specified path, + * to the specified value. + */ + + + virtual SDO_API void setDataObject(const char* path, DataObjectPtr value) = 0; + virtual SDO_API void setDataObject(const SDOString& path, DataObjectPtr value) = 0; + virtual SDO_API void setDataObject(unsigned int propertyIndex, DataObjectPtr value) = 0; + virtual SDO_API void setDataObject(const Property& property, DataObjectPtr value) = 0; + + /** getBoolean returns a boolean by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API bool getBoolean(const char* path) = 0; + virtual SDO_API bool getBoolean(const SDOString& path) = 0; + virtual SDO_API bool getBoolean(unsigned int propindex) = 0; + virtual SDO_API bool getBoolean(const Property& p) = 0; + + virtual SDO_API void setBoolean(const char* path, bool b) = 0; + virtual SDO_API void setBoolean(unsigned int propindex, bool b) = 0; + virtual SDO_API void setBoolean(const Property& p, bool b) = 0; + + /** getByte returns a char by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API char getByte(const char* path) = 0; + virtual SDO_API char getByte(unsigned int propindex) = 0; + virtual SDO_API char getByte(const Property& p) = 0; + + virtual SDO_API void setByte(const char* path, char c) = 0; + virtual SDO_API void setByte(unsigned int propindex, char c) = 0; + virtual SDO_API void setByte(const Property& p, char c) = 0; + + /** getCharacter returns a wchar_t by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API wchar_t getCharacter(const char* path) = 0; + virtual SDO_API wchar_t getCharacter(unsigned int propindex) = 0; + virtual SDO_API wchar_t getCharacter(const Property& p) = 0; + + virtual SDO_API void setCharacter(const char* path, wchar_t c) = 0; + virtual SDO_API void setCharacter(unsigned int propindex, wchar_t c) = 0; + virtual SDO_API void setCharacter(const Property& p, wchar_t c) = 0; + + + /** getlength returns the length of a string + * + * Specific to Bytes and Characters data objects. This returns the + * length of the buffer required to hold the contents of the object. + * len = do->getLength("name"); + * buf = new char[len]; + * reallen = do->getBytes("name",buf,len); + */ + virtual SDO_API unsigned int getLength(const char* path) = 0; + virtual SDO_API unsigned int getLength(unsigned int propindex) = 0; + virtual SDO_API unsigned int getLength(const Property& p) = 0; + virtual SDO_API unsigned int getLength() = 0; + + + /** getBytes returns a byte buffer + * + * A DataObject of type Bytes holds an array of bytes as its value. These + * methods transfer the contents of that buffer into an array of chars allocated + * by the users program. The return value is the number of bytes actually + * copied. + * The byte array is not necessarily null terminated. If a null terminated + * C style string is required, then getCString is an alternative. + * The third paarameter is the length of the allocated buffer, which may be more + * than the length of the byte array. If the length specified is less than the + * length of the byte array, then only a portion of the + * byte array is returned. + */ + + + virtual SDO_API unsigned int getBytes(const char* path, char* buf, unsigned int max) = 0; + virtual SDO_API unsigned int getBytes(unsigned int propindex, char* buf, unsigned int max) = 0; + virtual SDO_API unsigned int getBytes(const Property& p, char* buf, unsigned int max) = 0; + + virtual SDO_API void setBytes(const char* path, const char* c, unsigned int length) = 0; + virtual SDO_API void setBytes(unsigned int propindex, const char* c, unsigned int length) = 0; + virtual SDO_API void setBytes(const Property& p, const char* c, unsigned int length) = 0; + + /** getString returns a wide char buffer + * + * A DataObject of type String holds an array of wide characters as its value. These + * methods transfer the contents of that buffer into an array of wchar_t allocated + * by the users program. The return value is the number of wchar_t actually + * copied. + * The array is not necessarily null terminated. + * The third paarameter is the length of the allocated buffer, which may be more + * than the length of the array. If the length specified is less than the + * length of the array, then only a portion of the array is returned. + */ + + virtual SDO_API unsigned int getString(const char* path , wchar_t* c, unsigned int max) = 0; + virtual SDO_API unsigned int getString(unsigned int propindex, wchar_t* c, unsigned int max) = 0; + virtual SDO_API unsigned int getString(const Property& p, wchar_t* c, unsigned int max) = 0; + + virtual SDO_API void setString(const char* path, const wchar_t* c, unsigned int length) = 0; + virtual SDO_API void setString(unsigned int propindex, const wchar_t* c, unsigned int length) = 0; + virtual SDO_API void setString(const Property& p, const wchar_t* c, unsigned int length) = 0; + + /** getDate returns an SDODate by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + virtual SDO_API const SDODate getDate(const char* path) = 0; + virtual SDO_API const SDODate getDate(unsigned int propindex) = 0; + virtual SDO_API const SDODate getDate(const Property& p) = 0; + + virtual SDO_API void setDate(const char* path, const SDODate d) = 0; + virtual SDO_API void setDate(unsigned int propindex, const SDODate d) = 0; + virtual SDO_API void setDate(const Property& p, const SDODate d) = 0; + + /** getDouble returns a long double by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API long double getDouble(const char* path) = 0; + virtual SDO_API long double getDouble(unsigned int propindex) = 0; + virtual SDO_API long double getDouble(const Property& p) = 0; + + virtual SDO_API void setDouble(const char* path, long double d) = 0; + virtual SDO_API void setDouble(unsigned int propindex, long double d) = 0; + virtual SDO_API void setDouble(const Property& p, long double d) = 0; + + /** getFloat returns a float by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API float getFloat(const char* path) = 0; + virtual SDO_API float getFloat(unsigned int propindex) = 0; + virtual SDO_API float getFloat(const Property& p) = 0; + + virtual SDO_API void setFloat(const char* path, float f) = 0; + virtual SDO_API void setFloat(unsigned int propindex, float f) = 0; + virtual SDO_API void setFloat(const Property& p, float f) = 0; + + /** getInteger returns a long by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API long getInteger(const char* path) = 0; + virtual SDO_API long getInteger(unsigned int propindex) = 0; + virtual SDO_API long getInteger(const Property& p) = 0; + + virtual SDO_API void setInteger(const char* path, long i) = 0; + virtual SDO_API void setInteger(unsigned int propindex, long i) = 0; + virtual SDO_API void setInteger(const Property& p, long i) = 0; + + /** getLong returns a int64_t by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API int64_t getLong(const char* path) = 0; + virtual SDO_API int64_t getLong(unsigned int propindex) = 0; + virtual SDO_API int64_t getLong(const Property& p) = 0; + + virtual SDO_API void setLong(const char* path, int64_t l) = 0; + virtual SDO_API void setLong(unsigned int propindex, int64_t l) = 0; + virtual SDO_API void setLong(const Property& p, int64_t l) = 0; + + /** getShort returns a short by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API short getShort(const char* path) = 0; + virtual SDO_API short getShort(unsigned int propindex) = 0; + virtual SDO_API short getShort(const Property& p) = 0; + + virtual SDO_API void setShort(const char* path, short s) = 0; + virtual SDO_API void setShort(unsigned int propindex, short s) = 0; + virtual SDO_API void setShort(const Property& p, short s) = 0; + + + /** getCString returns a null terminated string by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual SDO_API const char* getCString(const char* path) = 0; + virtual SDO_API const char* getCString(unsigned int propertyIndex) = 0; + virtual SDO_API const char* getCString(const Property& prop) = 0; + + virtual SDO_API void setCString(const char* path, const char* value) = 0; + virtual SDO_API void setCString(unsigned int propertyIndex, const char* value) = 0; + virtual SDO_API void setCString (const Property& prop, const char* value) = 0; + + + /** setNull sets a data object value to null. + * + * A DataObjectType or DataType value may be set or unset. If it is set, then + * it may have a value, or it may be set to null. A distinction is drawn between + * being unset, having the default value, being set and being null. + * When the value of an integer (for example) is returned as zero, it could have + * been set to zero, or it could be null. Use isNull() to verify. + */ + + virtual SDO_API void setNull(const char* path) = 0; + virtual SDO_API void setNull(unsigned int propertyIndex) = 0; + virtual SDO_API void setNull(const Property& prop) = 0; + + virtual SDO_API bool isNull(const char* path) = 0; + virtual SDO_API bool isNull(unsigned int propertyIndex) = 0; + virtual SDO_API bool isNull(const Property& prop) = 0; + + /** isSet test whether the value has been set + * + * Returns whether a property of either this object or an object reachable + * from it, as identified by the specified path, + * is considered to be set. + */ + + virtual SDO_API bool isSet(const char* path) = 0; + virtual SDO_API bool isSet(unsigned int propertyIndex) = 0; + virtual SDO_API bool isSet(const Property& property) = 0; + + + /** isValid shows true if the value is set or defaulted. + * + * A property can be set, null, or have a default value - all + * of these are valid. It can also be unset, and have no default + * in which case this returns false. + */ + + virtual SDO_API bool isValid(const char* path) = 0; + virtual SDO_API bool isValid(unsigned int propertyIndex) = 0; + virtual SDO_API bool isValid(const Property& property ) =0; + + /** unset unsets a value previously set. + * + * unsets a property of either this object or an object reachable + * from it, as identified by the specified path. + */ + + virtual SDO_API void unset(const char* path) = 0; + virtual SDO_API void unset(unsigned int propertyIndex) = 0; + virtual SDO_API void unset(const Property& property) = 0; + + /** setUserData sets a reserved field in the data object. + * + * Each data object has precisely one 32 bit slot available to + * be used by applications. This is not part of the data, its + * just a place to store anything for later retrieval. + */ + + virtual SDO_API void setUserData(const char* path,void* value) = 0; + virtual SDO_API void setUserData(unsigned int propertyIndex, void* value) = 0; + virtual SDO_API void setUserData(const Property& property, void* value) = 0; + virtual SDO_API void setUserData(void* value) = 0; + virtual SDO_API void* getUserData(const char* path) = 0; + virtual SDO_API void* getUserData(unsigned int propertyIndex) = 0; + virtual SDO_API void* getUserData(const Property& property) = 0; + virtual SDO_API void* getUserData() = 0; + + + /** getSequence returns the sequence for a data object + * + * Returns the value of a Sequence property identified by + * the specified path. See Sequence. + */ + + virtual SDO_API SequencePtr getSequence() = 0; + virtual SDO_API SequencePtr getSequence(const char* path) = 0; + virtual SDO_API SequencePtr getSequence(unsigned int propertyIndex) = 0; + virtual SDO_API SequencePtr getSequence(const Property& property) = 0; + + + + /** createDataObject creates a data object value + * + * Returns a new data object contained by this object using the + * specified property,which must be a containment property. + * The type of the created object is the declared type + * of the specified property. + * If the property is many valued, this method adds an element to the + * list, otherwise it sets the value, removing any old value. + */ + + virtual SDO_API DataObjectPtr createDataObject(const char* propertyName) = 0; + virtual SDO_API DataObjectPtr createDataObject(unsigned int propertyIndex) = 0; + virtual SDO_API DataObjectPtr createDataObject(const Property& property) = 0; + + + + /** detach detaches an object from the graph + * + * This method removes the current data object from the graph, but does + * not destroy it. The DataObject can be re-attached to the graph later. + */ + + virtual SDO_API void detach() = 0; + + /** clear unsets all the properties + * + * This method unsets all the properties, and deletes all the data object + * propertiy values from this data object. + */ + + virtual SDO_API void clear() = 0; + + + /** getList gets the value of a many-valued property + * + * Many valued properties are returned as lists of DataObjects. + * These lists may contain primitives or data objects, but they behave + * like data objects. + * Getting a many valued integer consists of getting the list, then + * using the DataObjectList API to getInteger() for each list element. + */ + + virtual SDO_API DataObjectList& getList(const char* path) = 0; + virtual SDO_API DataObjectList& getList(unsigned int propIndex) = 0; + virtual SDO_API DataObjectList& getList(const Property& p) = 0; + virtual DataObjectList& getList() = 0; + + + /** getChangeSummary get the applicable change summary + * + * This method gets the applicable change summary for a data object. + * The summary is not necessarily attached to the data object, it may be + * the summary for a parent data object. No object with a summary attached + * may be a child of another object with a summary attached. + * See the ChangeSummary API for details of using the change sumamry. + */ + + virtual SDO_SPI ChangeSummaryPtr getChangeSummary() = 0; + virtual SDO_SPI ChangeSummaryPtr getChangeSummary(const char* path) = 0; + virtual SDO_SPI ChangeSummaryPtr getChangeSummary(unsigned int propIndex) = 0; + virtual SDO_SPI ChangeSummaryPtr getChangeSummary(const Property& prop) = 0; + + /** objectToXPath - utility to find the xpath from the root. + * + * objectToXPath returns a string which could be used to locate this data + * object from the root data object of the graph. + */ + + virtual SDO_SPI const char* objectToXPath() = 0; + + +}; +}; +}; + +#endif //_DATAOBJECT_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp new file mode 100644 index 0000000000..0188c26d6d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp @@ -0,0 +1,4307 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#include "commonj/sdo/disable_warn.h" +#include "commonj/sdo/DataObjectImpl.h" + + + +#include "commonj/sdo/SDORuntimeException.h" + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/SequenceImpl.h" + +#include "commonj/sdo/PropertyList.h" + +#include "commonj/sdo/Logging.h" + +#include "commonj/sdo/TypeImpl.h" + +#include "commonj/sdo/ChangeSummaryImpl.h" +#include "commonj/sdo/DataFactoryImpl.h" + +#include <string> +#include <stdio.h> +using std::string; + + + + +namespace commonj{ +namespace sdo { + + /** + * RDO is an internal class holding a property value + */ + + rdo::rdo(unsigned int infirst, DataObjectImpl* insecond) + : first(infirst), second(insecond) + { + } + + rdo::rdo() + { + first = 0; + second = 0; + } + + rdo::rdo (const rdo& inrdo) + { + first = inrdo.first; + second = inrdo.second; + } + + rdo::~rdo() + { + } + + +/** @def getPrimitive + * + * A macro for the getting of primitive values from a data object + */ + +#define getPrimitive(primval,retval,defval)\ + retval DataObjectImpl::get ##primval (unsigned int propertyIndex)\ + {\ + validateIndex(propertyIndex);\ + PropertyImpl* p = getPropertyImpl(propertyIndex);\ + if (p != 0 ) \ + {\ + if (p->isMany() || p->getTypeImpl()->isFromList())\ + {\ + string msg("Get value not available on many valued property:");\ + msg += p->getName();\ + SDO_THROW_EXCEPTION("get value", SDOUnsupportedOperationException,\ + msg.c_str());\ + }\ + DataObjectImpl* d = getDataObjectImpl(propertyIndex);\ + if (d != 0) \ + {\ + if (d->isNull())return (retval)0;\ + return d->get ##primval ();\ + }\ + if (isSet(propertyIndex)) return (retval)0;\ + return p->get ##primval ##Default();\ + }\ + return (retval)0;\ + } + +/** @def getCharsBasic + * + * A macro for the getting of primitive characters from a data object + */ + +#define getCharsBasic(primval,retval,defval)\ + unsigned int DataObjectImpl::get ##primval (unsigned int propertyIndex, retval valptr , unsigned int max)\ + {\ + validateIndex(propertyIndex);\ + PropertyImpl* p = getPropertyImpl(propertyIndex);\ + if (p != 0) \ + {\ + if (p->isMany()|| p->getTypeImpl()->isFromList())\ + {\ + string msg("Get value not available on many valued property:");\ + msg += p->getName();\ + SDO_THROW_EXCEPTION("character getter", SDOUnsupportedOperationException,\ + msg.c_str());\ + }\ + DataObjectImpl* d = getDataObjectImpl(propertyIndex);\ + if (d != 0) \ + { \ + if (d->isNull()) return 0;\ + return d->get ##primval ( valptr , max);\ + }\ + if (isSet(propertyIndex))return 0;\ + return p->get ##primval ##Default( valptr , max);\ + }\ + return 0;\ + } + + +/** @def setPrimitive + * + * A macro for the setting of primitive values in a data object + */ + +#define setPrimitive(primval,primtype,primnam)\ + void DataObjectImpl::set ##primval (unsigned int propertyIndex, primtype value)\ + {\ + validateIndex(propertyIndex);\ + PropertyImpl* pl = getPropertyImpl(propertyIndex);\ + if (pl != 0) \ + {\ + if (pl->isMany()|| pl->getTypeImpl()->isFromList())\ + {\ + string msg("Set value not available on many valued property:");\ + msg += pl->getName();\ + SDO_THROW_EXCEPTION("set value",SDOUnsupportedOperationException,\ + msg.c_str());\ + }\ + PropertyValueMap::iterator i;\ + for (i = PropertyValues.begin(); i != PropertyValues.end();++i)\ + {\ + if ((*i).first == propertyIndex)\ + {\ + logChange(propertyIndex);\ + (*i).second->unsetNull();\ + (*i).second->set ##primval (value);\ + return;\ + }\ + }\ + DataFactory* df = getDataFactory();\ + DataObjectImpl* b = new DataObjectImpl(df, df->getType(Type::SDOTypeNamespaceURI, primnam));\ + b->setContainer(this);\ + b->setApplicableChangeSummary();\ + logChange(propertyIndex);\ + PropertyValues.insert(PropertyValues.end(), rdo(propertyIndex,b));\ + b->set ##primval (value);\ + }\ + return;\ + } + + +/** @def setCharsBasic + * + * A macro for the setting of primitive characters in a data object + */ + +#define setCharsBasic(primval,primtype,primnam)\ + void DataObjectImpl::set ##primval (unsigned int propertyIndex, primtype value, unsigned int len)\ + {\ + validateIndex(propertyIndex);\ + PropertyImpl* pl = getPropertyImpl(propertyIndex);\ + if (pl != 0) \ + {\ + if (pl->isMany()|| pl->getTypeImpl()->isFromList())\ + {\ + string msg("Set value not available on many valued property:");\ + msg += pl->getName();\ + SDO_THROW_EXCEPTION("setter",SDOUnsupportedOperationException,\ + msg.c_str());\ + }\ + PropertyValueMap::iterator i;\ + for (i = PropertyValues.begin(); i != PropertyValues.end();++i)\ + {\ + if ((*i).first == propertyIndex)\ + {\ + logChange(propertyIndex);\ + (*i).second->unsetNull();\ + (*i).second->set ##primval (value, len);\ + return;\ + }\ + }\ + DataFactory* df = getDataFactory();\ + DataObjectImpl* b = new DataObjectImpl(df, df->getType(Type::SDOTypeNamespaceURI, primnam));\ + b->setContainer(this);\ + b->setApplicableChangeSummary();\ + logChange(propertyIndex);\ + PropertyValues.insert(PropertyValues.end(),rdo(propertyIndex,b));\ + b->set ##primval (value, len);\ + }\ + return;\ + } + + +/** @def getPrimitiveFromPath + * + * A macro for the getting of primitive values from a data object by path + */ + +#define getPrimitiveFromPath(primval, retval, defval)\ + retval DataObjectImpl::get ##primval (const char* path)\ + {\ + DataObjectImpl* d;\ + char *spath = 0;\ + char* prop = 0;\ + try {\ + spath = DataObjectImpl::stripPath(path);\ + prop = findPropertyContainer(spath,&d);\ + if (spath){\ + delete spath;\ + spath = 0;\ + }\ + if (d != 0) {\ + if (prop == 0 || (strlen(prop) == 0)) {\ + return d->get ##primval ();\ + }\ + else {\ + PropertyImpl* p = d->getPropertyImpl(prop);\ + if (p != 0) \ + {\ + if (p->isMany()|| p->getTypeImpl()->isFromList())\ + {\ + long l;\ + DataObjectImpl* doi = d->findDataObject(prop,&l);\ + delete prop;\ + prop = 0;\ + if (doi != 0) {\ + return doi->get ## primval();\ + }\ + string msg("Get value - index out of range:");\ + msg += path;\ + SDO_THROW_EXCEPTION("getter", SDOIndexOutOfRangeException,\ + msg.c_str());\ + }\ + else\ + {\ + delete prop;\ + prop = 0;\ + if (!d->isSet(*p)) {\ + return p->get ##primval ##Default();\ + }\ + return d->get ##primval (*p);\ + }\ + }\ + }\ + if (prop) {\ + delete prop;\ + prop = 0;\ + }\ + }\ + string msg("Get value - path not found");\ + SDO_THROW_EXCEPTION("getter", SDOPathNotFoundException,\ + msg.c_str());\ + }\ + catch (SDORuntimeException e) {\ + if (spath)delete spath;\ + if (prop) delete prop;\ + SDO_RETHROW_EXCEPTION("getter", e);\ + }\ + } + +#define getPrimitiveFromPathUsingSDOString(primval, retval, defval)\ + retval DataObjectImpl::get ##primval (const SDOString& path)\ + {\ + DataObjectImpl* d;\ + SDOString spath;\ + SDOString prop;\ + try {\ + DataObjectImpl::stripPath(path, spath);\ + prop = findPropertyContainer(spath, &d);\ + if (d != 0) {\ + if (prop.empty()) {\ + return d->get ##primval ();\ + }\ + else {\ + PropertyImpl* p = d->getPropertyImpl(prop);\ + if (p != 0) \ + {\ + if (p->isMany()|| p->getTypeImpl()->isFromList())\ + {\ + long l;\ + DataObjectImpl* doi = d->findDataObject(prop,&l);\ + if (doi != 0) {\ + return doi->get ## primval();\ + }\ + string msg("Get value - index out of range:");\ + msg += path;\ + SDO_THROW_EXCEPTION("getter", SDOIndexOutOfRangeException,\ + msg.c_str());\ + }\ + else\ + {\ + if (!d->isSet(*p)) {\ + return p->get ##primval ##Default();\ + }\ + return d->get ##primval (*p);\ + }\ + }\ + }\ + }\ + string msg("Get value - path not found");\ + SDO_THROW_EXCEPTION("getter", SDOPathNotFoundException,\ + msg.c_str());\ + }\ + catch (SDORuntimeException e) {\ + SDO_RETHROW_EXCEPTION("getter", e);\ + }\ + } + +/** @def getCharsFromPath + * + * A macro for the getting of primitive characters from a data object by path + */ + +#define getCharsFromPath(primval, retval, defval)\ + unsigned int DataObjectImpl::get ##primval (const char* path, retval valptr , unsigned int max)\ + {\ + DataObjectImpl* d;\ + char *spath = 0;\ + char* prop = 0;\ + try {\ + spath = DataObjectImpl::stripPath(path);\ + prop = findPropertyContainer(spath,&d);\ + if (spath){\ + delete spath;\ + spath = 0;\ + }\ + if (d != 0) {\ + if (prop == 0 || (strlen(prop) == 0)) {\ + return d->get ##primval ( valptr , max);\ + }\ + else {\ + PropertyImpl* p = d->getPropertyImpl(prop);\ + if (p != 0)\ + {\ + if (p->isMany() || p->getTypeImpl()->isFromList())\ + {\ + long l;\ + DataObjectImpl* doi = d->findDataObject(prop,&l);\ + delete prop;\ + prop = 0;\ + if (doi != 0) {\ + return doi->get ## primval (valptr, max);\ + }\ + string msg("Get value - index out of range");\ + msg += path;\ + SDO_THROW_EXCEPTION("getChars", SDOIndexOutOfRangeException,\ + msg.c_str());\ + }\ + else { \ + delete prop;\ + prop = 0;\ + if (!d->isSet(*p)) {\ + return p->get ##primval ##Default( valptr , max );\ + }\ + return d->get ##primval (*p, valptr , max);\ + }\ + }\ + }\ + if (prop) {\ + delete prop;\ + prop = 0;\ + }\ + }\ + string msg("Get value - path not found");\ + SDO_THROW_EXCEPTION("getCString", SDOPathNotFoundException,\ + msg.c_str());\ + }\ + catch (SDORuntimeException e) {\ + if (spath)delete spath;\ + if (prop) delete prop;\ + SDO_RETHROW_EXCEPTION("character getter", e);\ + }\ + } + + + +/** @def setPrimitiveFromPath + * + * A macro for the setting of primitive values in a data object by path + */ + +#define setPrimitiveFromPath(primval,setval,platval)\ + void DataObjectImpl::set ##primval (const char* path, setval value)\ + {\ + DataObjectImpl *d;\ + char* spath = 0;\ + char* prop = 0;\ + try {\ + spath = DataObjectImpl::stripPath(path);\ + prop = findPropertyContainer(spath,&d);\ + if (spath) {\ + delete spath;\ + spath = 0;\ + }\ + if (d != 0)\ + {\ + if (prop == 0 || (strlen(prop) == 0)) {\ + d->set ##primval (value);\ + }\ + else {\ + const PropertyImpl* p = d->getPropertyImpl(prop);\ + if (p == 0 && d->getType().isOpenType()) \ + {\ + p = d->define ##primval (prop);\ + }\ + if (p == 0)\ + {\ + string msg("Set value - path not found");\ + SDO_THROW_EXCEPTION("setter", SDOPathNotFoundException,\ + msg.c_str());\ + }\ + if (p->isMany()|| p->getTypeImpl()->isFromList())\ + {\ + long l;\ + DataObjectList& dol = d->getList((Property&)*p);\ + DataObjectImpl* doi = d->findDataObject(prop,&l);\ + delete prop;\ + prop = 0;\ + if (doi != 0) {\ + doi->set ## primval (value);\ + }\ + else {\ + dol.append(( platval) value);\ + }\ + }\ + else {\ + delete prop;\ + prop = 0;\ + d->set ##primval ((Property&)*p,value);\ + }\ + }\ + }\ + if (prop){\ + delete prop;\ + prop = 0;\ + }\ + }\ + catch (SDORuntimeException e) {\ + if (spath) delete spath;\ + if (prop) delete prop;\ + SDO_RETHROW_EXCEPTION("setter",e);\ + }\ + } + +/** @def setCharsFromPath + * + * A macro for the setting of primitive characters in a data object by path + */ + +#define setCharsFromPath(primval,setval)\ + void DataObjectImpl::set ##primval (const char* path, setval value, unsigned int len)\ + {\ + DataObjectImpl *d;\ + char* spath = 0;\ + char* prop = 0;\ + try {\ + spath = DataObjectImpl::stripPath(path);\ + prop = findPropertyContainer(spath,&d);\ + if (spath) {\ + delete spath;\ + spath = 0;\ + }\ + if (d != 0)\ + {\ + if (prop == 0 || (strlen(prop) == 0)) {\ + d->set ##primval (value, len);\ + }\ + else {\ + const PropertyImpl* p = d->getPropertyImpl(prop);\ + if (p == 0 && d->getType().isOpenType())\ + {\ + p = d->define ##primval (prop);\ + }\ + if (p == 0)\ + {\ + string msg("Set value - path not found");\ + SDO_THROW_EXCEPTION("setter", SDOPathNotFoundException,\ + msg.c_str());\ + }\ + if (p->isMany()|| p->getTypeImpl()->isFromList())\ + {\ + long l;\ + DataObjectList& dol = d->getList((Property&)*p);\ + DataObjectImpl* doi = d->findDataObject(prop,&l);\ + delete prop;\ + prop = 0;\ + if (doi != 0) {\ + doi->set ## primval (value, len);\ + }\ + else {\ + dol.append(value,len);\ + }\ + }\ + else { \ + delete prop;\ + prop = 0;\ + d->set ##primval ((Property&)*p,value, len);\ + }\ + }\ + }\ + if (prop){\ + delete prop;\ + prop = 0;\ + }\ + }\ + catch (SDORuntimeException e) {\ + if (spath) delete spath;\ + if (prop) delete prop;\ + SDO_RETHROW_EXCEPTION("setter",e);\ + }\ + } + + + + +/** @def getPrimitiveFromProperty + * + * A macro for the getting of primitive values in a data object by property + */ + +#define getPrimitiveFromProperty(primval,retval)\ + retval DataObjectImpl::get ##primval (const Property& property)\ + {\ + return get ##primval (getPropertyIndex(property));\ + } + + +/** @def getCharsFromProperty + * + * A macro for the getting of primitive characters in a data object by property + */ + +#define getCharsFromProperty(primval,retval)\ + unsigned int DataObjectImpl::get ##primval (const Property& property, retval val, unsigned int max)\ + {\ + return get ##primval (getPropertyIndex(property), val, max);\ + } + + +/** @def setPrimitiveFromProperty + * + * A macro for the setting of primitive values in a data object by property + */ + +#define setPrimitiveFromProperty(primval,primtype)\ + void DataObjectImpl::set ##primval (const Property& property, primtype value)\ + {\ + set ##primval (getPropertyIndex(property),value);\ + } + +/** @def setCharsFromProperty + * + * A macro for the setting of primitive characters in a data object by property + */ + +#define setCharsFromProperty(primval,primtype)\ + void DataObjectImpl::set ##primval (const Property& property, primtype value, unsigned int len)\ + {\ + set ##primval (getPropertyIndex(property),value, len);\ + } + + + + /** DataObject + * DataObjects are the non-primitive members of a Data graph. + * + * A data object is a representation of some structured data. + * it is the fundamental component in the SDO (Service Data Objects) package. + * Data objects support reflection, path-based accesss, convenience creation + * and deletion methods,and the ability to be part of a data graph. + * Each data object holds its data as a series of properties. + * Properties can be accessed by name, property index, or using the property + * meta object itself. + * A data object can also contain references to other data objects, through + * reference-type properties. + * A data object has a series of convenience accessors for its properties. + * These methods either use a path (String), a property index, + * or the property's meta object itself, to identify the property. + * Some examples of the path-based accessors are as follows: + * DataObjectPtr company = ...; + * company->getString("name"); + * company->setString("name", "acme"); + * company->getString("department.0/name") + * .n indexes from 0. + * company->getString("department[1]/name") [] indexes from 1. + * company->getDataObject("department[number=123]") returns the department where number=123 + * company->getDataObject("..") returns the containing data object + * company->getDataObject("/") returns the root containing data object + * There are specific accessors for the primitive types and commonly used + * data types like String. + */ + + +void DataObjectImpl::handlePropertyNotSet(const char* name) +{ + // change of behaviour - no longer throw for this. + +// string msg("Get value on unset and undefaulted property:"); +// msg += name; +// SDO_THROW_EXCEPTION("get value", SDOPropertyNotSetException, +// msg.c_str()); +} + + + + // setters and getters from a path specification + + getCharsFromPath(String, wchar_t* , 0); + getCharsFromPath(Bytes, char* , 0); + setCharsFromPath(String, const wchar_t*); + setCharsFromPath(Bytes, const char*); + getCharsFromProperty(String,wchar_t*); + getCharsFromProperty(Bytes,char*); + setCharsFromProperty(String,const wchar_t*); + setCharsFromProperty(Bytes,const char*); + getCharsBasic(String,wchar_t*,0); + getCharsBasic(Bytes,char*,0); + setCharsBasic(String,const wchar_t*,"String"); + setCharsBasic(Bytes,const char*,"Bytes"); + + + // Convenience methods for string/bytes length + + unsigned int DataObjectImpl::getLength(const Property& p) + { + switch (p.getType().getTypeEnum()) { + case Type::BooleanType: + return BOOL_SIZE; + case Type::CharacterType: + case Type::ByteType: + return BYTE_SIZE; + case Type::ShortType: + case Type::IntegerType: + case Type::LongType: + return MAX_LONG_SIZE; + case Type::FloatType: + return MAX_FLOAT_SIZE; + case Type::DoubleType: + return MAX_DOUBLE_SIZE; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + return getString(p,0,0); + case Type::BytesType: + return getBytes(p,0,0); + default: + return 0; + } + } + + unsigned int DataObjectImpl::getLength() + { + switch (getType().getTypeEnum()) { + case Type::BooleanType: + return BOOL_SIZE; + case Type::CharacterType: + case Type::ByteType: + return BYTE_SIZE; + case Type::ShortType: + case Type::IntegerType: + case Type::LongType: + return MAX_LONG_SIZE; + case Type::FloatType: + return MAX_FLOAT_SIZE; + case Type::DoubleType: + return MAX_DOUBLE_SIZE; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + return getString(0,0); + case Type::BytesType: + return getBytes(0,0); + default: + return 0; + } + } + + unsigned int DataObjectImpl::getLength(const char* path) + { + DataObjectImpl* d; + char * spath = DataObjectImpl::stripPath(path); + char * prop = findPropertyContainer(spath,&d); + if (spath) delete spath; + if (d != 0) { + if (prop == 0 || (strlen(prop) == 0)) { + return 0; + } + else + { + const Property& p = d->getProperty(prop); + delete prop; + return getLength(p); + } + } + else + { + if (prop) + { + const Property& p = getProperty(prop); + delete prop; + + return getLength(p); + } + else + { + return 0; + } + } + } + + unsigned int DataObjectImpl::getLength(unsigned int index) + { + return getLength(getProperty(index)); + } + + bool DataObjectImpl::getBoolean(const char* path) + { + return getBoolean(SDOString(path)); + } + + // getPrimitiveFromPath(Boolean,bool,false); // Provides DataObjectImpl::getBoolean(const char*) + getPrimitiveFromPathUsingSDOString(Boolean,bool,false); // Provides DataObjectImpl::getBoolean(const SDOString&) + getPrimitiveFromPath(Byte,char,0); + getPrimitiveFromPath(Character,wchar_t,0); + getPrimitiveFromPath(Short,short,0); + getPrimitiveFromPath(Integer,long,0); + getPrimitiveFromPath(Long,int64_t,0L); + getPrimitiveFromPath(Double,long double,0.0); + getPrimitiveFromPath(Float,float,0.0); + getPrimitiveFromPath(Date,const SDODate,0); + + + setPrimitiveFromPath(Boolean,bool, bool); + setPrimitiveFromPath(Byte,char, char); + setPrimitiveFromPath(Character,wchar_t, wchar_t); + setPrimitiveFromPath(Short,short, short); +#if __WORDSIZE ==64 + setPrimitiveFromPath(Integer,long, int64_t); +#else + setPrimitiveFromPath(Integer,long, long); +#endif + setPrimitiveFromPath(Long,int64_t, int64_t); + setPrimitiveFromPath(Float,float, float); + setPrimitiveFromPath(Double,long double, long double); + setPrimitiveFromPath(Date,const SDODate, const SDODate); + + + getPrimitiveFromProperty(Boolean,bool); + getPrimitiveFromProperty(Byte,char); + getPrimitiveFromProperty(Character,wchar_t); + getPrimitiveFromProperty(Short,short); + getPrimitiveFromProperty(Integer,long); + getPrimitiveFromProperty(Long,int64_t); + getPrimitiveFromProperty(Double,long double); + getPrimitiveFromProperty(Float,float); + getPrimitiveFromProperty(Date,const SDODate); + + setPrimitiveFromProperty(Boolean,bool); + setPrimitiveFromProperty(Byte,char); + setPrimitiveFromProperty(Character,wchar_t); + setPrimitiveFromProperty(Short,short); + setPrimitiveFromProperty(Integer,long); + setPrimitiveFromProperty(Long,int64_t); + setPrimitiveFromProperty(Float,float); + setPrimitiveFromProperty(Double,long double); + setPrimitiveFromProperty(Date,const SDODate); + + getPrimitive(Boolean,bool,false); + getPrimitive(Byte,char,0); + getPrimitive(Character,wchar_t,0); + getPrimitive(Short,short,0); + getPrimitive(Integer,long,0); + getPrimitive(Long,int64_t,0L); + getPrimitive(Double,long double,0.0); + getPrimitive(Float,float,0.0); + getPrimitive(Date,const SDODate,0); + + setPrimitive(Boolean,bool,"Boolean"); + setPrimitive(Byte,char, "Byte"); + setPrimitive(Character,wchar_t,"Character"); + setPrimitive(Short,short,"Short"); + setPrimitive(Integer,long,"Integer"); + setPrimitive(Long,int64_t,"Long"); + setPrimitive(Float,float,"Float"); + setPrimitive(Double,long double,"Double"); + setPrimitive(Date,const SDODate,"Date"); + + + + // open type support + + const PropertyImpl* DataObjectImpl::defineProperty(const char* propname, + const Type& t) + { + openProperties.insert( + openProperties.end(), PropertyImpl(getType(),propname, + (TypeImpl&)t, false, false, true)); + DataFactory* df = factory; + ((DataFactoryImpl*)df)->addOpenProperty( + PropertyImpl(getType(),propname, + (TypeImpl&)t, false, false, true)); + + return getPropertyImpl(propname); + } + const PropertyImpl* DataObjectImpl::defineProperty(const SDOString& propname, + const Type& t) + { + openProperties.insert(openProperties.end(), + PropertyImpl(getType(), + propname, + (TypeImpl&)t, + false, + false, + true)); + DataFactory* df = factory; + ((DataFactoryImpl*)df)->addOpenProperty(PropertyImpl(getType(), + propname, + (TypeImpl&)t, + false, + false, + true)); + + return getPropertyImpl(propname); + } + + void DataObjectImpl::undefineProperty(unsigned int index) + { + int point = index - openBase; + if (point < 0 || point >= openProperties.size()) return; + + // downgrade all the property settings above this one + + PropertyValueMap::iterator pit; + for (pit = PropertyValues.begin(); pit != PropertyValues.end();++pit) + { + if ((*pit).first > index) + { + if (getPropertyImpl((*pit).first)->isMany()) + { + DataObjectListImpl* dl = (*pit).second->getListImpl(); + if (dl != 0) dl->decrementPindex(); + } + (*pit).first-=1; + } + } + + // then remove this property from the list + + std::list<PropertyImpl>::iterator it = + openProperties.begin(); + for (int i=0;i<point;i++)++it; /* there must be a better way */ + + DataFactory* df = factory; + ((DataFactoryImpl*)df)->removeOpenProperty((*it).getName()); + + openProperties.erase(it); + + return; + } + + const PropertyImpl* DataObjectImpl::defineList(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "OpenDataObject"); + openProperties.insert( + openProperties.end(), PropertyImpl(getType(),propname, + (TypeImpl&)t, true, false, true)); + + DataFactory* df = factory; + ((DataFactoryImpl*)df)->addOpenProperty(PropertyImpl(getType(),propname, + (TypeImpl&)t, true, false, true)); + + return getPropertyImpl(propname); + } + + const PropertyImpl* DataObjectImpl::defineBoolean(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Boolean"); + return defineProperty(propname,t); + } + + const PropertyImpl* DataObjectImpl::defineByte(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Byte"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineCharacter(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Character"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineString(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "String"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineBytes(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Bytes"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineShort(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Short"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineInteger(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Integer"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineLong(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Long"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineFloat(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Float"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineDouble(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Double"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineDate(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Date"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineCString(const char* propname) + { + const Type& t = factory->getType(Type::SDOTypeNamespaceURI, "Bytes"); + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineDataObject(const char* propname, + const Type& t) + { + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineDataObject(const SDOString& propname, + const Type& t) + { + return defineProperty(propname,t); + } + const PropertyImpl* DataObjectImpl::defineDataObject(const char* propname, + const char* typeURI, const char* typeName) + { + const Type& t = factory->getType(typeURI, typeName); + return defineProperty(propname,t); + } + + // Used to return empty values - remove when defaults are there. + const char* DataObjectImpl::emptyString = ""; + + // Useful for debug, so not included in the macros above - but + // could be. + // getters and setters for strings + + const char* DataObjectImpl::getCString(unsigned int propertyIndex) + { + validateIndex(propertyIndex); + if ((getProperty(propertyIndex).isMany()) + || getPropertyImpl(propertyIndex)->getTypeImpl()->isFromList()) + { + + string msg("Get value not available on many valued property:"); + msg += getProperty(propertyIndex).getName(); + SDO_THROW_EXCEPTION("getCString", SDOUnsupportedOperationException, + msg.c_str()); + } + DataObjectImpl* d = getDataObjectImpl(propertyIndex); + if (d != 0) { + if (!d->isNull()) return d->getCString (); + return 0; + } + PropertyImpl* p = (PropertyImpl*)getPropertyImpl(propertyIndex); + if (p != 0) + { + if (isSet(propertyIndex)) return 0; + //if (p->isDefaulted()) + //{ + return p->getCStringDefault(); + //} + //else + //{ + // handlePropertyNotSet(p->getName()); + //} + } + return 0; + } + + + void DataObjectImpl::setCString (unsigned int propertyIndex, const char* value) + { + validateIndex(propertyIndex); + PropertyValueMap::iterator i; + if ((getProperty(propertyIndex).isMany()) + || getPropertyImpl(propertyIndex)->getTypeImpl()->isFromList()) + { + string msg("Set value not available on many valued property:"); + msg += getProperty(propertyIndex).getName(); + SDO_THROW_EXCEPTION("setString", SDOUnsupportedOperationException, + msg.c_str()); + } + for (i = PropertyValues.begin(); i != PropertyValues.end();++i) + { + if ((*i).first == propertyIndex) + { + logChange(propertyIndex); + (*i).second->unsetNull(); + (*i).second->setCString(value); + return; + } + } + DataFactory* df = getDataFactory(); + DataObjectImpl* b = new DataObjectImpl(df, df->getType(Type::SDOTypeNamespaceURI,"String")); + b->setContainer(this); + b->setApplicableChangeSummary(); + logChange(propertyIndex); + PropertyValues.insert(PropertyValues.end(),rdo(propertyIndex,b)); + b->setCString(value); + return; + } + + + const char* DataObjectImpl::getCString (const char* path) + { + DataObjectImpl* d = 0; + char* spath = 0; + char *prop = 0; + try { + spath = DataObjectImpl::stripPath(path); + prop = findPropertyContainer(spath,&d); + if (spath) { + delete spath; + spath = 0; + } + if (d != 0) { + if (prop == 0 || (strlen(prop) == 0)) { + return d->getCString(); + } + else { + PropertyImpl* p = d->getPropertyImpl(prop); + if (p != 0) + { + if (p->isMany()|| p->getTypeImpl()->isFromList()) + { + long l; + DataObjectImpl* doi = d->findDataObject(prop,&l); + delete prop; + prop = 0; + if (doi != 0) { + return doi->getCString(); + } + string msg("Get CString - index out of range"); + msg += path; + SDO_THROW_EXCEPTION("getter", SDOIndexOutOfRangeException, + msg.c_str()); + } + else { + delete prop; + prop = 0; + if (!d->isSet(*p)) { + //if (p->isDefaulted()) + //{ + return p->getCStringDefault(); + //} + //else + //{ + // handlePropertyNotSet(p->getName()); + //} + } + return d->getCString(*p); + } + } + } + } + if (prop){ + delete prop; + prop = 0; + } + string msg("Get CString - object not found"); + SDO_THROW_EXCEPTION("getCString", SDOPathNotFoundException, + msg.c_str()); + } + catch (SDORuntimeException e) { + if (spath) delete spath; + if (prop) delete prop; + SDO_RETHROW_EXCEPTION("getCString",e); + } + } + + + + void DataObjectImpl::setCString(const char* path, const char* value) + { + DataObjectImpl *d = 0; + char* spath = 0; + char* prop = 0; + try { + spath = DataObjectImpl::stripPath(path); + prop = findPropertyContainer(spath,&d); + if (spath) { + delete spath; + spath = 0; + } + if (d != 0) { + if (prop == 0 || (strlen(prop) == 0)) { + d->setCString(value); + } + else { + const PropertyImpl* p = d->getPropertyImpl(prop); + if (p == 0 && d->getType().isOpenType()) + { + p = d->defineBytes(prop); + } + if (p != 0) + { + if (p->isMany()|| p->getTypeImpl()->isFromList()) { + long l; + DataObjectList& dol = d->getList((Property&)*p); + DataObjectImpl* doi = d->findDataObject(prop,&l); + if (doi != 0) + { + doi->setCString(value); + } + else + { + dol.append(value); + } + } + else { + d->setCString((Property&)*p,value); + } + } + delete prop; + prop = 0; + } + } + if (prop) { + delete prop; + prop = 0; + } + } + catch (SDORuntimeException e) { + if (spath) delete spath; + if (prop) delete prop; + SDO_RETHROW_EXCEPTION("setCString",e); + } + } + + + + const char* DataObjectImpl::getCString (const Property& property) + { + return getCString(getPropertyIndex(property)); + } + + + void DataObjectImpl::setCString(const Property& property, const char* value) + { + setCString(getPropertyIndex(property),value); + } + + // null support + + bool DataObjectImpl::isNull(const unsigned int propertyIndex) + { + validateIndex(propertyIndex); + if ((getProperty(propertyIndex).isMany())) + { + return false; + } + + PropertyValueMap::iterator i; + for (i = PropertyValues.begin(); i != PropertyValues.end();++i) + { + if ((*i).first == propertyIndex) + { + return (*i).second->isNull(); + } + } + return false; + } + + bool DataObjectImpl::isNull(const Property& property) + { + return isNull(getPropertyIndex(property)); + } + + bool DataObjectImpl::isNull(const char* path) + { + DataObjectImpl *d = 0; + char* spath = 0; + char* prop = 0; + try { + spath = DataObjectImpl::stripPath(path); + prop = findPropertyContainer(spath,&d); + if (spath) { + delete spath; + spath = 0; + } + if (d != 0) { + if (prop == 0 || (strlen(prop) == 0)) { + return d->isNull(); + } + else { + const Property& p = d->getProperty(prop); + delete prop; + return d->isNull(p); + } + } + if (prop) { + delete prop; + prop = 0; + } + return false; + } + catch (SDORuntimeException e) { + if (spath) delete spath; + if (prop) delete prop; + SDO_RETHROW_EXCEPTION("isNull",e); + } + + } + void DataObjectImpl::setNull(const unsigned int propertyIndex) + { + validateIndex(propertyIndex); + if ((getProperty(propertyIndex).isMany())) + { + string msg("Setting a list to null is not supported:"); + msg += getProperty(propertyIndex).getName(); + SDO_THROW_EXCEPTION("setNull", SDOUnsupportedOperationException, + msg.c_str()); + } + + PropertyValueMap::iterator i; + for (i = PropertyValues.begin(); i != PropertyValues.end();++i) + { + if ((*i).first == propertyIndex) + { + logChange(propertyIndex); + (*i).second->setNull(); + return; + } + } + // The property was not set yet... + logChange(propertyIndex); + DataFactory* df = getDataFactory(); + DataObjectImpl* b = new DataObjectImpl(df, + getProperty(propertyIndex).getType()); + b->setContainer(this); + b->setApplicableChangeSummary(); + PropertyValues.insert(PropertyValues.end(),rdo(propertyIndex,b)); + b->setNull(); + + + } + void DataObjectImpl::setNull(const Property& property) + { + setNull(getPropertyIndex(property)); + } + + void DataObjectImpl::setNull(const char* path) + { + DataObjectImpl *d = 0; + char* spath = 0; + char* prop = 0, *pc = 0; + try { + spath = DataObjectImpl::stripPath(path); + prop = findPropertyContainer(spath,&d); + if (spath) { + delete spath; + spath = 0; + } + if (d != 0) { + if (prop == 0 || (strlen(prop) == 0)) { + try { + DataObjectImpl* cont = d->getContainerImpl(); + if (cont != 0) + { + pc = (char*) strrchr(path,'/'); + if (pc != 0)pc++; + } + const Property& pcont = cont->getProperty(pc); + cont->logChange(pcont); + } + catch (SDORuntimeException&) + { + } + d->setNull(); + } + else { + const PropertyImpl* p = d->getPropertyImpl(prop); + if (p == 0) + { + if(d->getType().isOpenType()) + { + string msg("Cannot set unassigned open property to null:"); + msg += prop; + SDO_THROW_EXCEPTION("setNull", SDOUnsupportedOperationException, + msg.c_str()); + } + else + { + string msg("Property Not Found:"); + msg += prop; + SDO_THROW_EXCEPTION("setNull", SDOPropertyNotFoundException, + msg.c_str()); + } + } + delete prop; + d->setNull((Property&)*p); + return; + } + } + if (prop) { + delete prop; + prop = 0; + } + return; + } + catch (SDORuntimeException e) { + if (spath) delete spath; + if (prop) delete prop; + SDO_RETHROW_EXCEPTION("setNull",e); + } + + } + + + + // getters and setters for a List data object + + DataObjectList& DataObjectImpl::getList(const char* path) + { + DataObjectImpl *d; + char* spath = DataObjectImpl::stripPath(path); + char* prop = findPropertyContainer(spath,&d); + if (spath) delete spath; + if (d != 0) { + if (prop == 0 || (strlen(prop) == 0)) { + return d->getList(); + } + else { + const PropertyImpl* p = d->getPropertyImpl(prop); + if (p == 0 && d->getType().isOpenType()) + { + p = d->defineList(prop); + } + if (p != 0) + { + delete prop; + return d->getList((Property&)*p); + } + } + } + if (prop) delete prop; + + string msg("Invalid path:"); + msg += path; + SDO_THROW_EXCEPTION("getList",SDOPathNotFoundException, msg.c_str()); + + } + + + + DataObjectList& DataObjectImpl::getList(unsigned int propIndex) + { + if (!(getProperty(propIndex).isMany())) + { + if (!getPropertyImpl(propIndex)->getTypeImpl()->isFromList()) + { + string msg("Get list not available on single valued property:"); + msg += getProperty(propIndex).getName(); + SDO_THROW_EXCEPTION("getList", SDOUnsupportedOperationException, + msg.c_str()); + } + } + DataObjectImpl* d = getDataObjectImpl(propIndex); + if (d == 0) + { + string msg("Property Not Found:"); + msg += getType().getProperty(propIndex).getName(); + SDO_THROW_EXCEPTION("getList", SDOPropertyNotFoundException, + msg.c_str()); + } + return d->getList(); + } + + DataObjectList& DataObjectImpl::getList(const Property& p) + { + if (!p.isMany()) + { + PropertyImpl* pi = (PropertyImpl*)&p; + if (!pi->getTypeImpl()->isFromList()) + { + string msg("Get list not available on single valued property:"); + msg += p.getName(); + SDO_THROW_EXCEPTION("getList", SDOUnsupportedOperationException, + msg.c_str()); + } + } + + int propIndex = getPropertyIndex(p); + DataObjectImpl* d = getDataObjectImpl(propIndex); + if (d == 0) { + // There is no list yet, so we need to create an + // empty data object to hold the list + DataFactory* df = getDataFactory(); + d = new DataObjectImpl(df, df->getType(Type::SDOTypeNamespaceURI,"DataObject")); + PropertyValues.insert(PropertyValues.end(),rdo(propIndex,d)); + d->setContainer(this); + d->setApplicableChangeSummary(); + + DataObjectListImpl* list = new DataObjectListImpl(df,this, + propIndex,p.getType().getURI(),p.getType().getName()); + d->setList(list); + + } + return d->getList(); + } + + + + DataObjectList& DataObjectImpl::getList() + { + if (getTypeImpl().isFromList()) + { + return getList("values"); + } + return *listValue; + } + + DataObjectListImpl* DataObjectImpl::getListImpl() + { + if (getTypeImpl().isFromList()) + { + DataObjectList& dl = getList("values"); + return (DataObjectListImpl*)&dl; + } + return listValue; + } + + + + ///////////////////////////////////////////////////////////////////////////// + // Utilities + ///////////////////////////////////////////////////////////////////////////// + + + // get an index, or throw if the prop is not part of this DO + + unsigned int DataObjectImpl::getPropertyIndex(const Property& p) + { + PropertyList props = getType().getProperties(); + + for (int i = 0; i < props.size() ; ++i) + { + if (!strcmp(props[i].getName(),p.getName()) ) + { + return i; + } + } + if (getType().isOpenType()) + { + std::list<PropertyImpl>::iterator j; + int count = 0; + for (j = openProperties.begin() ; + j != openProperties.end() ; ++j) + { + if (!strcmp((*j).getName(),p.getName())) + { + return count+openBase; + } + count++; + } + } + string msg("Cannot find property:"); + msg += p.getName(); + SDO_THROW_EXCEPTION("getPropertyIndex", SDOPropertyNotFoundException, + msg.c_str()); + } + + const Property& DataObjectImpl::getProperty(unsigned int index) + { + PropertyImpl* pi = getPropertyImpl(index); + if (pi == 0) + { + string msg("Index out of range"); + SDO_THROW_EXCEPTION("getProperty", SDOIndexOutOfRangeException, + msg.c_str()); + } + return (Property&)*pi; + } + + /** + * See if the property currently exists + */ + + bool DataObjectImpl::hasProperty(const char* name) + { + PropertyImpl* pi = getPropertyImpl(name); + if (pi == 0) return false; + return true; + } + + bool DataObjectImpl::hasProperty(const SDOString& name) + { + PropertyImpl* pi = getPropertyImpl(name); + if (pi == 0) return false; + return true; + } + + + PropertyImpl* DataObjectImpl::getPropertyImpl(unsigned int index) + { + PropertyList props = getType().getProperties(); + if (index < props.size()) + { + return (PropertyImpl*)&props[index]; + } + + if (getType().isOpenType()) + { + if (index >= openBase && index - openBase < openProperties.size()) + { + std::list<PropertyImpl>::iterator j; + int val = 0; + j = openProperties.begin(); + while (val < index-openBase && j != openProperties.end()) + { + val++; + j++; + } + if (j != openProperties.end()) return &(*j); + } + } + return 0; + } + + + ////////////////////////////////////////////////////////////////////// + // TODO - this is rubbish, but gets us by until XPATH is done + // trip the path down to characters which I am going to + // recognise later (a-z, A-Z _ [ ] .) + ////////////////////////////////////////////////////////////////////// + + const char* DataObjectImpl::templateString = + " /abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890=[]._#"; + + char* DataObjectImpl::stripPath(const char* path) + { + int pos = 0; + char* s = 0; + if (path == 0) return s; + + s = new char[strlen(path)+1]; + + for (int i=0;i < strlen(path); i++) + { + if (strchr(templateString,path[i]) != 0) { + s[pos++] = path[i]; + } + } + s[pos++] = 0; + return s; + } + + void DataObjectImpl::stripPath(const SDOString& path, SDOString& result) + { + result.erase(); + result.reserve(path.length()); + + size_t start = 0; + size_t position = path.find_first_not_of(templateString); + + while (position != string::npos) + { + result.append(path, start, (position - start)); + start = ++position; + position = path.find_first_not_of(templateString, position); + } + + result.append(path, start, string::npos); + + return; + } + + ////////////////////////////////////////////////////////////////////// + // Find a data object or return 0 if not found + ////////////////////////////////////////////////////////////////////// + + DataObjectImpl* DataObjectImpl::findDataObject(char* token, long* index) + { + // name , name[int], name[x=y] name.int + char c = 0; + char* beginbrace = strchr(token,'['); + char* endbrace = strchr(token,']'); + char* dot = strchr(token,'.'); + char* breaker = 0; + + + if (dot != 0) + { + if (beginbrace != 0) + { + breaker = (beginbrace < dot)? beginbrace:dot; + } + else + { + breaker = dot; + } + } + else + { + breaker = beginbrace; + } + + if (breaker == 0){ + // its this object, and a property thereof + *index = -1; + const Property& p = getProperty(token); + return getDataObjectImpl(p); + + } + + c = *breaker; + *breaker = 0; + const Property& p = getProperty(token); + *breaker = c; + + + breaker++; + + if (endbrace != 0) + { + *endbrace = 0; + } + + char* eq = strchr(breaker,'='); + + if (eq == 0) + { + int val = atoi(breaker); + DataObjectList& list = getList(p); + + // The spec says that depts[1] is the first element, + // as is depts.0 + + if (beginbrace != 0)val--; + + if (endbrace != 0)*endbrace = ']'; + + if (val >=0 && val < list.size()) + { + DataObject* dob = list[val]; + *index = val; + return (DataObjectImpl*)dob; + } + *index = -1; + return 0; + } + *eq = 0; + // breaker is now propname + eq++; + // eq is now propval + + DataObjectList& list = getList(p); + for (int li = 0 ; li < list.size() ; ++li) + { + // TODO comparison for double not ok + + const Type & t = list[li]->getType(); + const Property& p = list[li]->getProperty(breaker); + int ok = 0; + + switch (p.getTypeEnum()) + { + case Type::BooleanType: + { + // getCString will return "true" or "false" + if (!strcmp(eq,list[li]->getCString(p))) ok = 1; + } + break; + + case Type::ByteType: + { + char cc = (char)eq[0]; + // getByte return a char + if (cc == list[li]->getByte(p)) ok = 1; + } + break; + + case Type::CharacterType: + { + wchar_t wc = (wchar_t)((wchar_t*)eq)[0]; + // TODO - this is not a very accesible way of storing a wchar + if (wc == list[li]->getCharacter(p)) ok = 1; + } + break; + + case Type::IntegerType: + { + long ic = atol(eq); + if (ic == list[li]->getInteger(p)) ok = 1; + } + break; + + case Type::DateType: + { + long dc = atol(eq); + if (dc == (long)(list[li]->getDate(p).getTime())) ok = 1; + } + break; + + case Type::DoubleType: + { + // TODO - double needs a bigger size than float + long double ldc = (long double)atof(eq); + if (ldc == list[li]->getDouble(p)) ok = 1; + } + break; + + case Type::FloatType: + { + float fc = atof(eq); + if (fc == list[li]->getFloat(p)) ok = 1; + } + break; + + case Type::LongType: + { +#if defined(WIN32) || defined (_WINDOWS) + int64_t lic = (int64_t)_atoi64(eq); +#else + int64_t lic = (int64_t)strtoll(eq, NULL, 0); +#endif + + if (lic == list[li]->getLong(p)) ok = 1; + } + break; + + case Type::ShortType: + { + short sic = atoi(eq); + if (sic == list[li]->getShort(p)) ok = 1; + } + break; + + + case Type::BytesType: + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + { + + if (!strcmp(eq, list[li]->getCString(p))) ok = 1; + // try with quotes too + char *firstquote = strchr(eq,'"'); + char *firstsingle = strchr(eq,'\''); + char searchchar = 0; + + if (firstsingle == 0) + { + if (firstquote != 0) + { + searchchar = '"'; + } + } + else + { + if (firstquote != 0 && firstquote < firstsingle) + { + searchchar = '"'; + } + else + { + searchchar = '\''; + firstquote = firstsingle; + } + } + + if (searchchar != 0) + { + char* ender = strchr(firstquote+1,searchchar); + if (ender != 0) + { + *ender = 0; + if (!strcmp(firstquote+1, list[li]->getCString(p))) ok = 1; + *ender = searchchar; + } + } + } + break; + + case Type::DataObjectType: + break; + + default: + break; + } + + if (ok == 1) + { + *--eq='='; + if (endbrace != 0)*endbrace = ']'; + DataObject* dob = list[li]; + *index = li; + return (DataObjectImpl*)dob; + } + } + if (endbrace != 0)*endbrace = ']'; + *--eq='='; + return 0; + } +DataObjectImpl* DataObjectImpl::findDataObject(const SDOString& token, long* index) +{ + // name , name[int], name[x=y] name.int + // char c = 0; + size_t beginbrace = token.find('['); + size_t dot = token.find('.'); + size_t breaker = 0; + +// char* beginbrace = strchr(token,'['); +// char* endbrace = strchr(token,']'); +// char* dot = strchr(token,'.'); +// char* breaker = 0; + + if (dot != string::npos) + { + if (beginbrace != string::npos) + { + breaker = (beginbrace < dot) ? beginbrace : dot; + } + else + { + breaker = dot; + } + } + else + { + breaker = beginbrace; + } + + if (breaker == string::npos){ + // its this object, and a property thereof + *index = -1; + const Property& p = getProperty(token); + return getDataObjectImpl(p); + } + + // We did find a breaker character. + const Property& p = getProperty(SDOString(token, 0, breaker)); + + breaker++; + + size_t endbrace = token.find(']'); + SDOString breakerStr = token.substr(breaker, (endbrace - breaker)); + // Search for the first occurence of an = sign starting at the previously + // identified "breaker" character and ending at the endbrace just found. We + // need to make a new SDOString to contain that substring. + + size_t eq = breakerStr.find('='); + + if (eq == string::npos) + { + // There is no "=" sign + int val = atoi(breakerStr.c_str()); + DataObjectList& list = getList(p); + + // The spec says that depts[1] is the first element, as is depts.0 + if (beginbrace != string::npos) val--; + + if (val >=0 && val < list.size()) + { + DataObject* dob = list[val]; + *index = val; + return (DataObjectImpl*)dob; + } + *index = -1; + return 0; + } + + // We did find an "=" sign. + // *eq = 0; + SDOString PropertyName = token.substr(breaker, (eq - breaker)); + // breaker is now propname + eq++; + SDOString PropertyValue = token.substr(eq, (endbrace - eq)); + // eq is now propval + + DataObjectList& list = getList(p); + for (int li = 0 ; li < list.size() ; ++li) + { + // TODO comparison for double not ok + + const Type & t = list[li]->getType(); + const Property& p = list[li]->getProperty(PropertyName); + int ok = 0; + + switch (p.getTypeEnum()) + { + case Type::BooleanType: + { + // getCString will return "true" or "false" + if (!strcmp(PropertyValue.c_str(), list[li]->getCString(p))) ok = 1; + } + break; + + case Type::ByteType: + { + char cc = PropertyValue[0]; + // getByte return a char + if (cc == list[li]->getByte(p)) ok = 1; + } + break; + + case Type::CharacterType: + { + wchar_t wc = *((wchar_t*) PropertyValue.c_str()); + // wchar_t wc = (wchar_t)((wchar_t*)eq)[0]; + // TODO - this is not a very accesible way of storing a wchar + if (wc == list[li]->getCharacter(p)) ok = 1; + } + break; + + case Type::IntegerType: + { + long ic = atol(PropertyValue.c_str()); + if (ic == list[li]->getInteger(p)) ok = 1; + } + break; + + case Type::DateType: + { + long dc = atol(PropertyValue.c_str()); + if (dc == (long)(list[li]->getDate(p).getTime())) ok = 1; + } + break; + + case Type::DoubleType: + { + // TODO - double needs a bigger size than float + long double ldc = (long double)atof(PropertyValue.c_str()); + if (ldc == list[li]->getDouble(p)) ok = 1; + } + break; + + case Type::FloatType: + { + float fc = atof(PropertyValue.c_str()); + if (fc == list[li]->getFloat(p)) ok = 1; + } + break; + + case Type::LongType: + { +#if defined(WIN32) || defined (_WINDOWS) + int64_t lic = (int64_t)_atoi64(PropertyValue.c_str()); +#else + int64_t lic = (int64_t)strtoll(PropertyValue.c_str(), NULL, 0); +#endif + + if (lic == list[li]->getLong(p)) ok = 1; + } + break; + + case Type::ShortType: + { + short sic = atoi(PropertyValue.c_str()); + if (sic == list[li]->getShort(p)) ok = 1; + } + break; + + case Type::BytesType: + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + { + + if (!strcmp(PropertyValue.c_str(), list[li]->getCString(p))) ok = 1; + // try with quotes too + size_t firstquote = PropertyValue.find('"'); + size_t firstsingle = PropertyValue.find('\''); + + char searchchar = 0; + + if (firstsingle == string::npos) + { + if (firstquote != string::npos) + { + searchchar = '"'; + } + } + else + { + if (firstquote != string::npos && firstquote < firstsingle) + { + searchchar = '"'; + } + else + { + searchchar = '\''; + firstquote = firstsingle; + } + } + + if (searchchar != 0) + { + size_t ender = PropertyValue.find(searchchar, firstquote + 1); + if (ender != string::npos) + { + if (!strcmp(PropertyValue.substr(firstquote + 1, ender - firstquote).c_str(), list[li]->getCString(p))) + ok = 1; + } + } + } + break; + + case Type::DataObjectType: + break; + + default: + break; + } + + if (ok == 1) + { + DataObject* dob = list[li]; + *index = li; + return (DataObjectImpl*)dob; + } + } + return 0; +} + + + ////////////////////////////////////////////////////////////////////// + // Find a data object and a property name within it. + ////////////////////////////////////////////////////////////////////// + + char* DataObjectImpl::findPropertyContainer(const char* path, DataObjectImpl** din) + { + + // initially check for "#/" which indicates that we need to find the root + // object first + if (path == 0) return 0; + + if (strlen(path) <= 2) + { + if (path[0] == '#') + { + DataObjectImpl* root = this; + while (root->getContainerImpl() != 0) + { + root = root->getContainerImpl(); + } + *din = root; + return 0; + } + } + + if (path[0] == '#' && path[1] == '/') + { + DataObjectImpl* root = this; + while (root->getContainerImpl() != 0) + { + root = root->getContainerImpl(); + } + return root->findPropertyContainer(&path[2],din); + } + + DataObjectImpl* d; + char* i = (char*) strchr(path,'/'); + char* remaining = 0; + char* token = 0; + + if (i != 0) + { + int j = strlen(path) - strlen(i); + if (j > 0) + { + token = new char[j + 1]; + strncpy(token,path, j); + token[j] = 0; + } + if (strlen(i) > 1) + { + remaining = new char[strlen(i)]; + strcpy(remaining, i+1); + } + } + else + { + remaining = new char[strlen(path) + 1]; + strcpy(remaining,path); + } + + if (token == 0) + { + if (remaining != 0 && !strcmp(remaining,"..")) + { + /* Its the container itself */ + *din = getContainerImpl(); + delete remaining; + return 0; + } + + /* Its this data object - property could be empty or + valid or invalid - user must check */ + *din = this; + return remaining; + } + + if (!strcmp(token,"..")) { + /* Its derived from the container */ + d = getContainerImpl(); + /* carry on trying to find a property */ + if (d != 0) { + char* ret = d->findPropertyContainer(remaining, din); + delete token; + if (remaining) delete remaining; + return ret; + } + /* Give up - no container */ + delete token; + if (remaining) delete remaining; + *din = 0; + return 0; + } + + + /* Try to find a property ....*/ + long l; + d = findDataObject(token,&l); + if (d != 0) { + char* ret = d->findPropertyContainer(remaining,din); + delete token; + if (remaining) delete remaining; + return ret; + } + + /* Give up its not in the tree */ + + delete token; + if (remaining) delete remaining; + *din = 0; + return 0; + } + SDOString DataObjectImpl::findPropertyContainer(const SDOString& path, DataObjectImpl** din) + { + // initially check for "#/" which indicates that we need to find the root object first + if (path.empty()) return 0; + + if (path.length() <= 2) + { + if (path[0] == '#') + { + DataObjectImpl* root = this; + while (root->getContainerImpl() != 0) + { + root = root->getContainerImpl(); + } + *din = root; + return SDOString(); + } + } + + if (path[0] == '#' && path[1] == '/') + { + DataObjectImpl* root = this; + while (root->getContainerImpl() != 0) + { + root = root->getContainerImpl(); + } + return root->findPropertyContainer(SDOString(path, 2), din); + } + + DataObjectImpl* d; + size_t slashPos = path.find('/'); // i is the subscript of the found character + SDOString remaining; + SDOString token; + + if (slashPos != string::npos) // If we found a slash character + { + if (slashPos > 0) // If there is something before the slash + { + token.assign(path, 0, slashPos); + } + if ((path.length() - slashPos) > 1) // If there is something after the slash + { + remaining.assign(path, slashPos + 1, string::npos); + } + } + else + { + remaining = path; + } + + if (token.empty()) + { + if (remaining == "..") + { + /* Its the container itself */ + *din = getContainerImpl(); + return SDOString(); + } + + /* Its this data object - property could be empty or + valid or invalid - user must check */ + *din = this; + return remaining; + } + + if (token == "..") { + /* Its derived from the container */ + d = getContainerImpl(); + /* carry on trying to find a property */ + if (d != 0) { + return d->findPropertyContainer(remaining, din); + } + /* Give up - no container */ + *din = 0; + return 0; + } + + /* Try to find a property ....*/ + long l; + d = findDataObject(token, &l); + if (d != 0) { + return d->findPropertyContainer(remaining, din); + } + + /* Give up its not in the tree */ + *din = 0; + return 0; + } + + + + + // Returns a read-only List of the Properties currently used in thIs DataObject. + // ThIs list will contain all of the properties in getType().getProperties() + // and any properties where isSet(property) is true. + // For example, properties resulting from the use of + // open or mixed XML content are present if allowed by the Type. + // The list does not contain duplicates. + // The order of the properties in the list begins with getType().getProperties() + // and the order of the remaining properties is determined by the implementation. + // The same list will be returned unless the DataObject is updated so that + // the contents of the list change + // @return the list of Properties currently used in thIs DataObject. + + PropertyList /* Property */ DataObjectImpl::getInstanceProperties() + { + std::vector<PropertyImpl*> theVec; + PropertyList propList = getType().getProperties(); + for (int i = 0 ; i < propList.size() ; ++i) + { + Property& p = propList[i]; + theVec.insert(theVec.end(),(PropertyImpl*)&p); + } + std::list<PropertyImpl>::iterator j; + for (j = openProperties.begin() ; + j != openProperties.end() ; ++j) + { + theVec.insert(theVec.end(),&(*j)); + } + return PropertyList(theVec); + } + + void DataObjectImpl::setInstancePropertyType(unsigned int index, + const Type* t) + { + if (index >= openBase && index - openBase < openProperties.size()) + { + std::list<PropertyImpl>::iterator j; + unsigned int count = openBase; + for (j = openProperties.begin() ; + j != openProperties.end() ; ++j) + { + if (count == index) + { + openProperties.insert(j, + PropertyImpl(getType(), + (*j).getName(), + (TypeImpl&)*t, + (*j).isMany(), + (*j).isReadOnly(), + (*j).isContainment())); + + DataFactory* df = factory; + ((DataFactoryImpl*)df)->addOpenProperty( + PropertyImpl(getType(), + (*j).getName(), + (TypeImpl&)*t, + (*j).isMany(), + (*j).isReadOnly(), + (*j).isContainment())); + + openProperties.erase(j); + + return; + } + count++; + } + } + return; + } + + // Returns the Sequence for thIs DataObject. + // When Type.isSequencedType() == true, + // the Sequence of a DataObject corresponds to the + // XML elements representing the values of its properties. + // Updates through DataObject and the Lists or Sequences returned + // from DataObject operate on the same data. + // When Type.isSequencedType() == false, null is returned. + // @return the <code>Sequence</code> or null. + + SequenceImpl* DataObjectImpl::getSequenceImpl() + { + + return sequence; + } + + SequencePtr DataObjectImpl::getSequence() + { + return (SequencePtr)sequence; + } + + SequencePtr DataObjectImpl::getSequence(const char* path) + { + DataObject* d = (DataObject*)getDataObject(path); + if (d) return d->getSequence(); + return 0; + } + + SequencePtr DataObjectImpl::getSequence(unsigned int propertyIndex) + { + DataObject* d = (DataObject*)getDataObject(propertyIndex); + if (d) return d->getSequence(); + return 0; + } + + SequencePtr DataObjectImpl::getSequence(const Property& property) + { + DataObject* d = (DataObject*)getDataObject(property); + if (d) return d->getSequence(); + return 0; + } + + + + ChangeSummaryPtr DataObjectImpl::getChangeSummary(const char* path) + { + DataObjectImpl* d = getDataObjectImpl(path); + return d->getChangeSummary(); + } + + ChangeSummaryPtr DataObjectImpl::getChangeSummary(unsigned int propIndex) + { + DataObjectImpl* d = getDataObjectImpl(propIndex); + return d->getChangeSummary(); + } + + ChangeSummaryPtr DataObjectImpl::getChangeSummary(const Property& prop) + { + DataObjectImpl* d = getDataObjectImpl(prop); + return d->getChangeSummary(); + + } + + ChangeSummaryPtr DataObjectImpl::getChangeSummary() + { + if (getType().isChangeSummaryType()) + { + return (ChangeSummaryPtr)localCS; + } + // The changesummaryobject MUST be a change summary type + // but as an additional check against looping, I will use + // a redundent getSummary() method. + // TODO - remove this. + if (changesummaryobject != 0) return + (ChangeSummaryPtr)(changesummaryobject->getSummary()); + return 0; + } + + + ChangeSummaryImpl* DataObjectImpl::getChangeSummaryImpl() + { + if (getType().isChangeSummaryType()) + { + return localCS; + } + // The changesummaryobject MUST be a change summary type + // but as an additional check against looping, I will use + // a redundent getSummary() method. + // TODO - remove this. + if (changesummaryobject != 0) return changesummaryobject->getSummary(); + return 0; + } + + ChangeSummaryImpl* DataObjectImpl::getSummary() + { + return localCS; + } + + // sets a property of either this object or an object reachable from it, + // as identified by the specified path, + // to the specified value. + // @param path the path to a valid object and property. + // @param value the new value for the property. + + void DataObjectImpl::setDataObject(const char* path, DataObjectPtr value) + { + DataObjectImpl* d; + char* prop = findPropertyContainer(path, &d); + if (d != 0) + { + if (prop != 0) { + const PropertyImpl* p = d->getPropertyImpl(prop); + if (p == 0 && d->getType().isOpenType()) + { + if (value != 0) + { + p = d->defineDataObject(prop, value->getType()); + } + } + if (p != 0) + { + if (p->isMany()) + { + DataObjectList& dol = d->getList((Property&)*p); + long index; + DataObjectImpl* dx = d->findDataObject(prop,&index); + if (index >= 0) + { + if(index < dol.size()) + { + dol.setDataObject((unsigned int)index,value); + } + else + { + dol.append(value); + } + delete prop; + return; + } + string msg("Set of data object on many valued item"); + msg += path; + SDO_THROW_EXCEPTION("setDataObject", SDOUnsupportedOperationException, + msg.c_str()); + } + else + { + d->setDataObject((Property&)*p,value); + delete(prop); + return; + } + } + } + } + if (prop != 0)delete prop; + + string msg("Path not valid:"); + msg += path; + SDO_THROW_EXCEPTION("setDataObject", SDOPathNotFoundException, + msg.c_str()); + } + +void DataObjectImpl::setDataObject(const SDOString& path, DataObjectPtr value) +{ + DataObjectImpl* d; + SDOString prop = findPropertyContainer(path, &d); + if (d != 0) + { + if (!prop.empty()) { + const PropertyImpl* p = d->getPropertyImpl(prop); + if (p == 0 && d->getType().isOpenType()) + { + if (value != 0) + { + p = d->defineDataObject(prop, value->getType()); + } + } + if (p != 0) + { + if (p->isMany()) + { + DataObjectList& dol = d->getList((Property&)*p); + long index; + DataObjectImpl* dx = d->findDataObject(prop,&index); + if (index >= 0) + { + if(index < dol.size()) + { + dol.setDataObject((unsigned int)index,value); + } + else + { + dol.append(value); + } + return; + } + string msg("Set of data object on many valued item"); + msg += path; + SDO_THROW_EXCEPTION("setDataObject", SDOUnsupportedOperationException, + msg.c_str()); + } + else + { + d->setDataObject((Property&)*p,value); + return; + } + } + } + } + + string msg("Path not valid:"); + msg += path; + SDO_THROW_EXCEPTION("setDataObject", SDOPathNotFoundException, + msg.c_str()); +} + + void DataObjectImpl::validateIndex(unsigned int index) + { + PropertyList pl = getType().getProperties(); + + if (index >= pl.size()) { + + // open type support + if (getType().isOpenType()) + { + if (index < openBase + openProperties.size()) + { + return; + } + } + + string msg("Index of property out of range:"); + msg += index; + SDO_THROW_EXCEPTION("Index Validation", SDOIndexOutOfRangeException, + msg.c_str()); + } + } + + void DataObjectImpl::transferChildren(DataObject* d, DataFactory* f) + { + bool isData = false; + PropertyList pl = d->getInstanceProperties(); + for (int i=0;i<pl.size();i++) + { + // even primitives need their DF fixed up + if (pl[i].getType().isDataType()) + { + isData = true; + } + + if (!d->isSet(pl[i]) || d->isNull(pl[i])) + { + continue; + } + if (pl[i].isMany()) + { + DataObjectList& dl = d->getList(pl[i]); + for (int j=0;j<dl.size();j++) + { + + DataObject* d2 = dl[j]; + if (d2) { + ((DataObjectImpl*)d2)->setDataFactory(f); + if (!isData)transferChildren(d2,f); + } + } + } + else + { + DataObject* d3 = d->getDataObject(pl[i]); + if (d3) + { + ((DataObjectImpl*)d3)->setDataFactory(f); + if (!isData)transferChildren(d3,f); + } + } + } + } + + + + void DataObjectImpl::checkFactory(DataObjectPtr dob, + unsigned int propertyIndex) + { + + DataObjectImpl* d = (DataObjectImpl*)(DataObject*)dob; + + if (d->getDataFactory() == getDataFactory()) return; + + // Temporary alteration to test the feasibility and + // problems associated with allowing data object 'migration' + // lets move this one and all its children to the factory of the + // new parent if the factories are compatible. + + DataFactoryImpl* f = (DataFactoryImpl*)getDataFactory(); + + if (d->getContainer() != 0) + { + string msg("Insertion of object from another factory is only allowed if the parent is null: "); + const Type& t = d->getType(); + msg += t.getURI(); + msg += "#"; + msg += t.getName(); + msg += " into property "; + msg += getProperty(propertyIndex).getName(); + msg += " of "; + msg += getType().getURI(); + msg += "#"; + msg += getType().getName(); + SDO_THROW_EXCEPTION("checkFactory", SDOInvalidConversionException, + msg.c_str()); + } + + if (f->isCompatible(d->getDataFactory(),d)) + { + d->setDataFactory(getDataFactory()); + transferChildren(d,getDataFactory()); + return; + } + + + // This is the default position.... + + string msg("Insertion from incompatible factory "); + const Type& t = d->getType(); + msg += t.getURI(); + msg += "#"; + msg += t.getName(); + msg += " into property "; + msg += getProperty(propertyIndex).getName(); + msg += " of "; + msg += getType().getURI(); + msg += "#"; + msg += getType().getName(); + SDO_THROW_EXCEPTION("checkFactory", SDOInvalidConversionException, + msg.c_str()); + } + + + void DataObjectImpl::checkType( const Property& prop, + const Type& objectType) + { + const Type& propType = prop.getType(); + if (propType.equals(objectType)) return; + + DataFactory* df = (DataFactory*)factory; + + const TypeImpl* ti = ((DataFactoryImpl*)df)->findTypeImpl + (objectType.getURI(),objectType.getName()); + if (ti != 0) + { + do + { + ti = (const TypeImpl*)ti->getBaseType(); + if (ti == 0) break; + if (propType.equals(*ti)) return; + } while (ti != 0); + + // allow types of any substitutes + const PropertyImpl* pi = + getPropertyImpl(getPropertyIndex(prop)); + if (pi != 0) + { + unsigned int subcount = pi->getSubstitutionCount(); + for (int i=0;i<subcount;i++) + { + const Type* tsub = pi->getSubstitutionType(i); + if (tsub != 0 && tsub->equals(objectType)) return; + } + } + } + + // no match.. + string msg("Insertion of object of incompatible type "); + msg += objectType.getURI(); + msg += "#"; + msg += objectType.getName(); + msg += " into property of type "; + msg += propType.getURI(); + msg += "#"; + msg += propType.getName(); + SDO_THROW_EXCEPTION("TypeCheck", SDOInvalidConversionException, + msg.c_str()); + } + + void DataObjectImpl::setDataObject(unsigned int propertyIndex, DataObjectPtr value) + { + setDataObject(getProperty(propertyIndex), value); + } + + void DataObjectImpl::setDataObject(const Property& prop, DataObjectPtr value) + { + unsigned int propertyIndex = getPropertyIndex(prop); + + + if (value != 0) + { + checkFactory(value, propertyIndex); + checkType(prop,value->getType()); + } + + validateIndex(propertyIndex); + + if (prop.isReference() && value != 0) + { + // just need to make sure that the object is already part of our + // tree. + DataObjectImpl* r1 = this; + while (r1->getContainerImpl() != 0) + { + r1 = r1->getContainerImpl(); + } + DataObjectImpl* r2 = (DataObjectImpl*)(DataObject*)value; + while (r2->getContainerImpl() != 0) + { + r2 = r2->getContainerImpl(); + } + if (r1 != r2) + { + string msg("Set of a reference to an object outside the graph"); + SDO_THROW_EXCEPTION("setDataObject", SDOUnsupportedOperationException, + msg.c_str()); + } + } + + if ((prop.isMany())) + { + string msg("Set operation on a many valued property:"); + msg += prop.getName(); + SDO_THROW_EXCEPTION("setDataObject", SDOUnsupportedOperationException, + msg.c_str()); + } + + + if (value == 0) + { + PropertyValueMap::iterator j; + for (j = PropertyValues.begin(); j != PropertyValues.end(); ++j) + { + if ((*j).first == propertyIndex) { + if (prop.isReference()) + { + ((*j).second)->unsetReference(this, prop); + } + else + { + // log both deletion and change - change is not + // automatically recorded by deletion. + ((*j).second)->logDeletion(); + } + logChange(prop); + (*j).second = RefCountingPointer<DataObjectImpl>(0); + + return; + } + } + logChange(prop); + PropertyValues.insert(PropertyValues.end(),rdo(propertyIndex,(DataObjectImpl*)0)); + return; + } + + DataObject* dob = value; + PropertyValueMap::iterator i; + for (i = PropertyValues.begin(); i != PropertyValues.end(); ++i) + { + if ((*i).first == propertyIndex) { + + if (prop.isReference()) + { + ((*i).second)->unsetReference(this, prop); + } + else + { + // log both deletion and change - change is not + // automatically recorded by deletion. + ((*i).second)->logDeletion(); + } + logChange(prop); + + (*i).second = RefCountingPointer<DataObjectImpl>((DataObjectImpl*)dob); + + + if (prop.isReference()) + { + ((DataObjectImpl*)dob)->setReference(this, prop); + } + else + { + logCreation((*i).second, this, prop); + } + return; + } + } + if (prop.isReference()) + { + ((DataObjectImpl*)dob)->setReference(this, prop); + } + else + { + ((DataObjectImpl*)dob)->setContainer(this); + ((DataObjectImpl*)dob)->setApplicableChangeSummary(); + // log creation before putting into property values. + // also log change - not done by logCreation + logCreation((DataObjectImpl*)dob, this, prop); + } + + logChange(prop); + + PropertyValues.insert(PropertyValues.end(),rdo(propertyIndex,(DataObjectImpl*)dob)); + return; + } + + + bool DataObjectImpl::isValid(const char* path) + { + DataObjectImpl* d; + char* prop = findPropertyContainer(path,&d); + if (d != 0) { + if (prop != 0) { + const Property& p = d->getProperty(prop); + delete prop; + return d->isValid(p); + } + } + if (prop != 0)delete prop; + string msg("Invalid path:"); + msg += path; + SDO_THROW_EXCEPTION("isSet" ,SDOPathNotFoundException, + msg.c_str()); + } + + + // Returns whether a property of either this object or an object reachable + // from it, as identified by the specified path, + // is considered to be set. + // @param path the path to a valid Object* and property. + + bool DataObjectImpl::isSet(const char* path) + { + DataObjectImpl* d; + char* prop = findPropertyContainer(path,&d); + if (d != 0) { + if (prop != 0) { + const Property& p = d->getProperty(prop); + delete prop; + return d->isSet(p); + } + } + if (prop != 0)delete prop; + string msg("Invalid path:"); + msg += path; + SDO_THROW_EXCEPTION("isSet" ,SDOPathNotFoundException, + msg.c_str()); + } + + bool DataObjectImpl::isValid(unsigned int propertyIndex) + { + return isValid(getProperty(propertyIndex)); + } + + bool DataObjectImpl::isValid(const Property& p) + { + if (p.isDefaulted()) return true; + if (isSet(p))return true; + return false; + } + + bool DataObjectImpl::isSet(unsigned int propertyIndex) + { + return isSet(getProperty(propertyIndex), propertyIndex); + } + + bool DataObjectImpl::isSet(const Property& property) + { + return isSet(property, getPropertyIndex(property)); + } + + bool DataObjectImpl::isSet(const Property& prop, unsigned int propertyIndex) + { + PropertyValueMap::iterator i; + for (i = PropertyValues.begin(); i != PropertyValues.end(); ++i) + { + if ((*i).first == propertyIndex) { + if (prop.isMany()) + { + DataObjectImpl* dol = (*i).second; + if (dol != 0 && dol->getList().size() == 0) + { + return false; + } + } + return true; + } + } + return false; + } + + + // unSets a property of either this Object or an Object reachable from it, + // as identified by the specified path. + // @param path the path to a valid Object and property. + // @see #unSet(Property) + + void DataObjectImpl::unset(const char* path) + { + + DataObjectImpl* d; + char* prop = findPropertyContainer(path,&d); + if (d != 0) + { + if (prop != 0){ + const Property& p = d->getProperty(prop); + if (p.isMany()) + { + char *c; + if ((c = strchr(prop,'[')) != 0) + { + char *c1 = strchr(c,']'); + if (c1 != 0)*c1 = 0; + unsigned int i = atoi(++c); + if (i > 0){ + i--; + DataObjectList& li = d->getList(p); + li.remove(i); + } + delete prop; + return; + } + if ((c = strchr(prop,'.')) != 0) + { + unsigned int i = atoi(++c); + DataObjectList& li = d->getList(p); + li.remove(i); + delete prop; + return; + } + } + delete prop; + d->unset(p); + return; + } + } + if (prop != 0) delete prop; + + string msg("Invalid path:"); + msg += path; + SDO_THROW_EXCEPTION("unset", SDOPathNotFoundException, + msg.c_str()); + } + + void DataObjectImpl::unset(unsigned int propertyIndex) + { + unset(getProperty(propertyIndex)); + } + + void DataObjectImpl::unset(const Property& p) + { + PropertyValueMap::iterator i; + unsigned int index = getPropertyIndex(p); + + if (getType().isSequencedType()) + { + Sequence* sq = getSequence(); + sq->removeAll(p); + } + + for (i = PropertyValues.begin(); i != PropertyValues.end(); ++i) + { + if ((*i).first == index) { + DataObjectImplPtr dol = (*i).second; + if (p.getType().isDataType()) + { + dol->clearReferences(); + logChange(index); + if (p.isMany()) { + DataObjectList& dl = dol->getList(); + while (dl.size() > 0) + { + RefCountingPointer<DataObject> dli = dl.remove(0); + } + } + else + { + PropertyValues.erase(i); + } + } + else { + // if its a reference, we dont want to delete anything + if (!p.isReference()) + { + if (dol) { + dol->clearReferences(); + if (p.isMany()) { + DataObjectList& dl = dol->getList(); + while (dl.size() > 0) + { + if (p.getType().isDataObjectType()) + { + DataObject* dob = dl[0]; + ((DataObjectImpl*)dob)->logDeletion(); + } + // the remove will record a change + // remove will also clear the container. + RefCountingPointer<DataObject> dli = dl.remove(0); + } + } + else + { + PropertyValues.erase(i); + dol->logDeletion(); + logChange(index); + } + } + else + { + logChange(index); + PropertyValues.erase(i); + } + } + else { + logChange(index); + PropertyValues.erase(i); + } + } + if (getType().isOpenType() && index >= openBase) + { + if (p.isMany()) + { + PropertyValues.erase(i); + } + undefineProperty(index); + } + return; + } + } + return; + } + + + + // Returns the value of a DataObject property identified by + // the specified path. + // @param path the path to a valid object and property. + // @return the DataObject value of the specified property. + + RefCountingPointer<DataObject> DataObjectImpl::getDataObject(const char* path) + { + DataObjectImpl* ptr = getDataObjectImpl(path); + return RefCountingPointer<DataObject> ((DataObject*)ptr); + } + + RefCountingPointer<DataObject> DataObjectImpl::getDataObject(const SDOString& path) + { + DataObjectImpl* ptr = getDataObjectImpl(path); + return RefCountingPointer<DataObject> ((DataObject*)ptr); + } + + DataObjectImpl* DataObjectImpl::getDataObjectImpl(const char* path) + { + + DataObjectImpl* d = 0; + char* prop = findPropertyContainer(path,&d); + if (d != 0) { + if (prop != 0) { + if (strchr(prop,'[') || strchr(prop,'.')) { + /* Its a multlvalued property */ + long l; + DataObjectImpl* theob = d->findDataObject(prop,&l); + delete prop; + if (theob == 0) { + string msg("Get DataObject - index out of range:"); + msg += path; + SDO_THROW_EXCEPTION("getDataObject" ,SDOIndexOutOfRangeException, + msg.c_str()); + } + return theob; + } + else + { + if (strlen(prop) == 0) + { + delete prop; + prop = 0; + return d; + } + const Property& p = d->getProperty(prop); + delete prop; + prop = 0; + return d->getDataObjectImpl(p); + } + } + else { + return d; + } + } + if (prop != 0)delete prop; + + string msg("Invalid path:"); + msg += path; + SDO_THROW_EXCEPTION("getDataObject" ,SDOPathNotFoundException, + msg.c_str()); + } + + // +++ + + DataObjectImpl* DataObjectImpl::getDataObjectImpl(const SDOString& path) + { + + DataObjectImpl* d = 0; + SDOString prop = findPropertyContainer(path,&d); + // char* prop = findPropertyContainer(path,&d); + if (d != 0) { + if (!prop.empty()) { + if (prop.find_first_of("[.") != string::npos) { + /* Its a multlvalued property */ + long l; + DataObjectImpl* theob = d->findDataObject(prop,&l); + if (theob == 0) { + string msg("Get DataObject - index out of range:"); + msg += path; + SDO_THROW_EXCEPTION("getDataObject" ,SDOIndexOutOfRangeException, + msg.c_str()); + } + return theob; + } + else + { + if (prop.length() == 0) + { + return d; + } + const Property& p = d->getProperty(prop); + return d->getDataObjectImpl(p); + } + } + else { + return d; + } + } + + string msg("Invalid path:"); + msg += path; + SDO_THROW_EXCEPTION("getDataObject" ,SDOPathNotFoundException, + msg.c_str()); + } + + // --- + + RefCountingPointer<DataObject> DataObjectImpl::getDataObject(unsigned int propertyIndex) + { + if ((getProperty(propertyIndex).isMany())) + { + string msg("get operation on a many valued property:"); + msg += getProperty(propertyIndex).getName(); + SDO_THROW_EXCEPTION("getDataObject", SDOUnsupportedOperationException, + msg.c_str()); + } + DataObjectImpl* ptr = getDataObjectImpl(propertyIndex);; + return RefCountingPointer<DataObject>((DataObject*)ptr); + } + + DataObjectImpl* DataObjectImpl::getDataObjectImpl(unsigned int propertyIndex) + { + PropertyValueMap::iterator i; + for (i = PropertyValues.begin(); i != PropertyValues.end(); ++i) + { + if ((*i).first == propertyIndex) + { + DataObject* dob = (*i).second; + if (dob == 0 || ((DataObjectImpl*)dob)->isNull())return 0; + return (DataObjectImpl*)dob; + } + } + return 0; + } + + + RefCountingPointer<DataObject> DataObjectImpl::getDataObject(const Property& property) + { + DataObjectImpl* ptr = getDataObjectImpl(property); + return RefCountingPointer<DataObject>((DataObject*)ptr); + } + + DataObjectImpl* DataObjectImpl::getDataObjectImpl(const Property& property) + { + return getDataObjectImpl(getPropertyIndex(property)); + } + + + + + + // Returns a new DataObject contained by this Object using the specified property, + // which must be a containment property. + // The type of the created Object is the declared type of the specified property. + + RefCountingPointer<DataObject> DataObjectImpl::createDataObject(const char* propertyName) + { + // Throws runtime exception for type or property not found + + const Property& p = getProperty(propertyName); + return createDataObject(p); + } + + // Returns a new DataObject contained by this Object using the specified property, + // which must be a containment property. + // The type of the created Object is the declared type of the specified property. + + RefCountingPointer<DataObject> DataObjectImpl::createDataObject(unsigned int propertyIndex) + { + const Property& p = getProperty(propertyIndex); + return createDataObject(p); + } + + // Returns a new DataObject contained by this Object using the specified property, + // which must be a containment property. + // The type of the created Object is the declared type of the specified property. + + RefCountingPointer<DataObject> DataObjectImpl::createDataObject(const Property& property) + { + const Type& tp = property.getType(); + return createDataObject(property,tp.getURI(), tp.getName()); + } + + + // Returns a new DataObject contained by this Object using the specified property, + // which must be a containment property. + // The type of the created Object is the declared type of the specified property. + + RefCountingPointer<DataObject> DataObjectImpl::createDataObject(const Property& property, const char* namespaceURI, + const char* typeName) + { + if (!property.isContainment()) + { + string msg("Create data object on non-containment property:"); + msg += property.getName(); + SDO_THROW_EXCEPTION("createDataObject", SDOUnsupportedOperationException, + msg.c_str()); + } + + DataFactory* df = getDataFactory(); + if (property.isMany()) { + /* add to the list */ + RefCountingPointer<DataObject> ptr = df->create(namespaceURI, typeName); + DataObject* dob = ptr; + ((DataObjectImpl*)dob)->setContainer(this); + ((DataObjectImpl*)dob)->setApplicableChangeSummary(); + + // log creation before adding to list - the change must record the old state + // of the list + logCreation(((DataObjectImpl*)dob), this, property); + //logChange(property); + + DataObjectImpl* theDO = getDataObjectImpl(property); + if ( theDO == 0) { /* No value set yet */ + unsigned int ind = getPropertyIndex(property); + RefCountingPointer<DataObject> listptr = + df->create(Type::SDOTypeNamespaceURI,"DataObject"); + + DataObject* doptr = listptr; + PropertyValues.insert(PropertyValues.end(),rdo(ind,(DataObjectImpl*)doptr)); + ((DataObjectImpl*)doptr)->setContainer(this); + ((DataObjectImpl*)doptr)->setApplicableChangeSummary(); + + DataObjectListImpl* list = new DataObjectListImpl(df, + this, ind, namespaceURI,typeName); + + ((DataObjectImpl*)doptr)->setList(list); + // the append will log a change to the property. + list->append(ptr); + + // now done by list append + //if (getType().isSequencedType()) + //{ + // SequenceImpl* sq = getSequenceImpl(); + // sq->push(property,0); + //} + } + else + { + DataObjectList& list = theDO->getList(); + // the append will log a change to the property, and update the + // sequence + list.append(ptr); + //if (getType().isSequencedType()) + //{ + // SequenceImpl* sq = getSequenceImpl(); + // sq->push(property,list.size()-1); + //} + + } + return ptr; + + } + else { + unset(property); + DataObjectImpl* ditem = + new DataObjectImpl(df, df->getType(namespaceURI, typeName)); + ditem->setContainer(this); + ditem->setApplicableChangeSummary(); + + // log both creation and change - creations no longer log + // changes automatically. + + logCreation(ditem, this, property); + logChange(property); + + PropertyValues.insert(PropertyValues.end(), + rdo(getPropertyIndex(property),ditem)); + if (getType().isSequencedType()) + { + SequenceImpl* sq = getSequenceImpl(); + sq->push(property,0); + } + return RefCountingPointer<DataObject>((DataObject*)ditem); + } + return 0; + } + + void DataObjectImpl::setList( DataObjectList* theList) + { + listValue = (DataObjectListImpl*)theList; + } + + + bool DataObjectImpl::remove(DataObjectImpl* indol) + { + PropertyValueMap::iterator i; + for (i = PropertyValues.begin(); i != PropertyValues.end(); ++i) + { + const Property& prop = getProperty((*i).first); + if (prop.isMany()) + { + DataObjectList& dol = ((*i).second)->getList(); + for (int j=0;j< dol.size(); j++) + { + if (dol[j] == indol) + { + indol->logDeletion(); + logChange(prop); + indol->setContainer(0); + dol.remove(j); + return true; + } + } + } + DataObjectImpl* tmp = (*i).second; + if (tmp == indol) { + indol->logDeletion(); + logChange(prop); + indol->setContainer(0); + PropertyValues.erase(i); + return true; + } + } + return false; + } + + // remove this Object from its container and dont unSet all its properties. + + void DataObjectImpl::detach() + { + // remove this data object from its tree + clearReferences(); + if (container == 0) return; + container->remove(this); + return ; + } + + void DataObjectImpl::clear() + { + // clear this objects state + PropertyValueMap::iterator i = PropertyValues.begin(); + + while (i != PropertyValues.end()) + { + unset((*i).first); + i = PropertyValues.begin(); + } + return ; + } + + // Returns the containing Object + // of 0 if there is no container. + + RefCountingPointer<DataObject> DataObjectImpl::getContainer() + { + DataObject* dob = (DataObject*)container; + return RefCountingPointer<DataObject> (dob); + } + + DataObjectImpl* DataObjectImpl::getContainerImpl() + { + return container; + } + + void DataObjectImpl::setContainer(DataObjectImpl* d) + { + container = d; + } + + const Property* DataObjectImpl::findInProperties(DataObject* ob) + { + PropertyValueMap::iterator i; + for (i = PropertyValues.begin() ;i != PropertyValues.end() ; ++i) + { + if (getProperty((*i).first).isReference()) continue; + if (getProperty((*i).first).isMany()) + { + DataObjectList& dl = ((*i).second)->getList(); + for (int j = 0 ; j < dl.size(); j++) + { + if (dl[j] == ob) + { + return &(getProperty((*i).first)); + } + } + } + else + { + if ((*i).second == ob) + { + return &(getProperty((*i).first)); + } + } + } + return 0; // this can happen if the object has been detached + + //string msg("Object cannot find its containing property"); + //SDO_THROW_EXCEPTION("FindInProperties" ,SDOPropertyNotFoundException, + // msg.c_str()); + } + + // Return the Property of the data Object containing this data Object + // or 0 if there is no container. + + const Property& DataObjectImpl::getContainmentProperty() + { + if (container != 0) { + const Property* p = container->findInProperties(this); + if (p != 0)return *p; + } + SDO_THROW_EXCEPTION("getContainmentProperty" ,SDOPropertyNotFoundException, + "Object cannot find its containment property"); + } + + + // Returns the data Object's type. + // The type defines the properties available for reflective access. + + const Type& DataObjectImpl::getType() + { + return (const Type&)(*ObjectType); + } + + const Type::Types DataObjectImpl::getTypeEnum() + { + return ObjectType->getTypeEnum(); + } + + const TypeImpl& DataObjectImpl::getTypeImpl() + { + return (const TypeImpl&)*ObjectType; + } + + + // open type support + + const Property& DataObjectImpl::getProperty(const char* prop) + { + PropertyImpl* pi = getPropertyImpl(prop); + if (pi == 0) + { + string msg("Cannot find property:"); + msg += prop; + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException, + msg.c_str()); + + } + return (Property&)*pi; + } + const Property& DataObjectImpl::getProperty(const SDOString& prop) + { + PropertyImpl* pi = getPropertyImpl(prop); + if (pi == 0) + { + string msg("Cannot find property:"); + msg += prop; + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException, + msg.c_str()); + + } + return (Property&)*pi; + } + + PropertyImpl* DataObjectImpl::getPropertyImpl(const char* prop) + { + PropertyImpl* pi = getTypeImpl().getPropertyImpl(prop); + if (pi != 0) return pi; + + if (getType().isOpenType()) + { + std::list<PropertyImpl>::iterator j; + for (j=openProperties.begin(); + j != openProperties.end(); ++j) + { + if (!strcmp((*j).getName(), prop)) + { + return (PropertyImpl*)&(*j); + } + } + } + return 0; + } + PropertyImpl* DataObjectImpl::getPropertyImpl(const SDOString& prop) + { + PropertyImpl* pi = getTypeImpl().getPropertyImpl(prop); + if (pi != 0) return pi; + + if (getType().isOpenType()) + { + std::list<PropertyImpl>::iterator j; + for (j=openProperties.begin(); + j != openProperties.end(); ++j) + { + if (!strcmp((*j).getName(), prop.c_str())) + { + return (PropertyImpl*)&(*j); + } + } + } + return 0; + } + + DataFactory* DataObjectImpl::getDataFactory() + { + return factory; + } + + void DataObjectImpl::setDataFactory(DataFactory* df) + { + ObjectType = (TypeImpl*)&(df->getType(ObjectType->getURI(), + ObjectType->getName())); + factory = df; + } + + /////////////////////////////////////////////////////////////////////////// + // These finally are the setters/getters for primitives given + // that the data object is a primitive type. + /////////////////////////////////////////////////////////////////////////// + + + bool DataObjectImpl::getBoolean() + { + return getTypeImpl().convertToBoolean(value, valuelength); + } + + + char DataObjectImpl::getByte() + { + return getTypeImpl().convertToByte(value,valuelength); + + } + + + wchar_t DataObjectImpl::getCharacter() + { + return getTypeImpl().convertToCharacter(value,valuelength); + + } + + long DataObjectImpl::getInteger() + { + return getTypeImpl().convertToInteger(value,valuelength); + + } + + + long double DataObjectImpl::getDouble() + { + return getTypeImpl().convertToDouble(value,valuelength); + } + + + float DataObjectImpl::getFloat() + { + return getTypeImpl().convertToFloat(value,valuelength); + + } + + + + int64_t DataObjectImpl::getLong() + { + return getTypeImpl().convertToLong(value,valuelength); + + } + + + short DataObjectImpl::getShort() + { + return getTypeImpl().convertToShort(value,valuelength); + + } + + unsigned int DataObjectImpl::getString( wchar_t* outptr, unsigned int max) + { + if (outptr == 0 || max == 0) return valuelength; + return getTypeImpl().convertToString(value, outptr, valuelength, max); + + } + unsigned int DataObjectImpl::getBytes( char* outptr, unsigned int max) + { + if (outptr == 0 || max == 0) return valuelength; + return getTypeImpl().convertToBytes(value, outptr, valuelength, max); + + } + + const char* DataObjectImpl::getCString() + { + return getTypeImpl().convertToCString(value, &asStringBuffer, valuelength); + + } + + const SDODate DataObjectImpl::getDate() + { + return getTypeImpl().convertToDate(value, valuelength); /* time_t == long*/ + + } + + DataObjectImpl* DataObjectImpl::getDataObject() + { + return (DataObjectImpl*)getTypeImpl().convertToDataObject(value, valuelength); + + } + + + void DataObjectImpl::setBoolean(bool invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + } + + + void DataObjectImpl::setByte(char invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + + } + + + void DataObjectImpl::setCharacter(wchar_t invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + } + + void DataObjectImpl::setString(const wchar_t* invalue, unsigned int len) + { + valuelength = getTypeImpl().convert(&value,invalue, len); + return; + } + + void DataObjectImpl::setBytes(const char* invalue, unsigned int len) + { + valuelength = getTypeImpl().convert(&value,invalue, len); + return; + } + + void DataObjectImpl::setInteger(long invalue) + { +#if __WORDSIZE ==64 + valuelength = getTypeImpl().convert(&value,(int64_t)invalue); +#else + valuelength = getTypeImpl().convert(&value,invalue); +#endif + return; + } + + + void DataObjectImpl::setDouble(long double invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + } + + void DataObjectImpl::setFloat(float invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + + } + + + void DataObjectImpl::setLong(int64_t invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + } + + + void DataObjectImpl::setShort(short invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + + } + + void DataObjectImpl::setCString(const char* invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + } + + void DataObjectImpl::setDate(const SDODate invalue) + { + valuelength = getTypeImpl().convertDate(&value,invalue); /* time_t == long*/ + return; + } + + void DataObjectImpl::setDataObject(DataObject* invalue) + { + valuelength = getTypeImpl().convert(&value,invalue); + return; + } + + void DataObjectImpl::setNull() + { + isnull = true; + } + + bool DataObjectImpl::isNull() + { + return isnull; + } + + void DataObjectImpl::unsetNull() + { + isnull = false; + } + + + DataObjectImpl::DataObjectImpl(const TypeImpl& t) + { + ObjectType = (TypeImpl*)&t; + container = 0; + value = 0; /* Will be initialized when used */ + valuelength = 0; + asStringBuffer = 0; +// asXPathBuffer = 0; + isnull = false; + + // open type support + openBase = t.getPropertiesSize() ; + + userdata = (void*)0xFFFFFFFF; + + if (t.isChangeSummaryType()) + { + changesummaryobject = 0; + localCS = new ChangeSummaryImpl(); + } + else + { + changesummaryobject = 0; + localCS = 0; + } + + if (getType().isSequencedType()) sequence = new SequenceImpl(this); + else sequence = 0; + } + + + + DataObjectImpl::DataObjectImpl(DataFactory* df, const Type& t) : ObjectType((TypeImpl*)&t), + factory(df) + { + container = 0; + value = 0; + valuelength = 0; + asStringBuffer = 0; +// asXPathBuffer = 0; + isnull = false; + + // open type support + openBase = ObjectType->getPropertiesSize() ; + + userdata = (void*)0xFFFFFFFF; + + if (ObjectType->isChangeSummaryType()) + { + changesummaryobject = 0; + localCS = new ChangeSummaryImpl(); + } + else + { + changesummaryobject = 0; + localCS = 0; + } + + if (getType().isSequencedType()) + { + sequence = new SequenceImpl(this); + } + else + { + sequence = 0; + } + } + + void DataObjectImpl::deleteValue() + { + switch (getTypeEnum()) + { + case Type::BooleanType: + case Type::ByteType: + case Type::CharacterType: + case Type::IntegerType: + case Type::DateType: + case Type::DoubleType: + case Type::FloatType: + case Type::LongType: + case Type::ShortType: + case Type::BytesType: + delete (char*)value; + return; + + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + delete (wchar_t*)value; + return; + + case Type::DataObjectType: + return; + + default: + return; + } + } + + DataObjectImpl::~DataObjectImpl() + { + // We do not want to log changes to our own deletion + // if this DO owns the ChangeSummary. Do not delete + // it here as contained DOs still have a reference to it. + + if (getTypeImpl().isChangeSummaryType()) + { + ChangeSummaryPtr c = getChangeSummary(); + if (c) { + if (c->isLogging()) + { + c->endLogging(); + } + } + } + + + clearReferences(); + PropertyValueMap::iterator i = PropertyValues.begin(); + while (i != PropertyValues.end()) + { + unset((*i).first); + if (i == PropertyValues.begin()) + { + // unset has not removed the item from the list - do it + // here instead + PropertyValues.erase(i); + } + i = PropertyValues.begin(); + } + + // Theory: A DO cant get here if its still attached to anything, + //so we dont need to detach.... + //detach(); + + + if (asStringBuffer != 0) delete asStringBuffer; +// if (asXPathBuffer != 0) delete asXPathBuffer; + + if (value != 0) + { + if (getType().isDataType())deleteValue(); + } + + + + if (getType().isSequencedType()) + { + if (sequence != 0) delete sequence; + } + + + if (getTypeImpl().isChangeSummaryType() ) + { + if (getChangeSummary() != 0) + { + delete localCS; + localCS = 0; + } + } + } + + void DataObjectImpl::setApplicableChangeSummary() + { + changesummaryobject = 0; + if (getType().isChangeSummaryType()) + { + changesummaryobject = 0; + return; + } + else { + DataObjectImpl* dob = getContainerImpl(); + while (dob != 0) { + if (dob->getType().isChangeSummaryType()) + { + changesummaryobject = dob; + return; + } + dob = dob->getContainerImpl(); + } + } + + } + + void DataObjectImpl::logCreation(DataObjectImpl* dol, DataObjectImpl* cont, + const Property& theprop) + { + if (getChangeSummaryImpl() != 0 && getChangeSummaryImpl()->isLogging()) + { + getChangeSummaryImpl()->logCreation(dol,cont,theprop); + } + } + + void DataObjectImpl::logDeletion() + { + // Only log if ChangeSummary is inherited from container + + if (getChangeSummaryImpl() != 0 && getChangeSummaryImpl()->isLogging() && !getType().isChangeSummaryType()) + { + DataObjectImpl* cont = getContainerImpl(); + if (cont != 0) // log if there is a container. If there is not, then + // this can only be the object with the CS, so logging + // would not make sense. + { + const Property* p = cont->findInProperties(this); + if ( p != 0) // if the object is not in the properties, then its been + // detached, and has already been logged as deleted + { + getChangeSummaryImpl()->logDeletion(this,cont,*p, + objectToXPath(), true); + } + } + } + } + + void DataObjectImpl::logChange(const Property& prop) + { + if (getChangeSummaryImpl() != 0 && getChangeSummaryImpl()->isLogging()) + { + getChangeSummaryImpl()->logChange(this,prop); + } + } + + void DataObjectImpl::logChange(unsigned int propIndex) + { + if (getChangeSummaryImpl() != 0 && getChangeSummaryImpl()->isLogging()) + { + getChangeSummaryImpl()->logChange(this,getProperty(propIndex)); + } + } + // reference support + + void DataObjectImpl::setReference(DataObject* dol, const Property& prop) + { + LOGINFO_1(INFO,"ChangeSummary:Setting a reference to %s",prop.getName()); + + refs.push_back(new Reference(dol,prop)); + } + void DataObjectImpl::unsetReference(DataObject* dol, const Property& prop) + { + LOGINFO_1(INFO,"ChangeSummary:Unsetting a reference to %s",prop.getName()); + + for (int i=0;i< refs.size();i++) + { + if (refs[i]->getDataObject() == dol) + { + if (!strcmp(refs[i]->getProperty().getName(), + prop.getName())) + { + delete refs[i]; + refs.erase(refs.begin() + i); + } + } + } + } + + + void DataObjectImpl::clearReferences() + { + for (int i=0;i<refs.size();i++) + { + // Note - no loop as the referer must be of type reference + refs[i]->getDataObject()->unset(refs[i]->getProperty()); + delete refs[i]; + } + refs.clear(); + } + + const char* DataObjectImpl::objectToXPath() + { + asXPathBuffer = ""; + + DataObjectImpl* dob = getContainerImpl(); + DataObject*thisob = this; + while (dob != 0){ + const Property& p = thisob->getContainmentProperty(); + if (asXPathBuffer != "") + { + asXPathBuffer = "/" + asXPathBuffer; + } + + if (p.isMany()) { + DataObjectList& dol = dob->getList(p); + for (int i=0;i<dol.size();i++) + { + if (dol[i] == thisob) + { + char index[64]; + sprintf(index,"%d",i); + asXPathBuffer = index + asXPathBuffer; + asXPathBuffer = "." + asXPathBuffer; + break; + } + } + } + asXPathBuffer = p.getName() + asXPathBuffer; + + thisob = dob; + dob = dob->getContainerImpl(); + } + + asXPathBuffer = "#/" + asXPathBuffer; + + return asXPathBuffer.c_str(); +/* + char* temp1; + char* temp2; + + if (asXPathBuffer == 0) + { + asXPathBuffer = new char[2]; + sprintf(asXPathBuffer,"#"); + } + + DataObjectImpl* dob = getContainerImpl(); + DataObject*thisob = this; + while (dob != 0){ + const Property& p = thisob->getContainmentProperty(); + const char* name = p.getName(); + temp1 = new char[strlen(name) + 34]; + temp1[0] = 0; + + + if (p.isMany()) { + DataObjectList& dol = dob->getList(p); + for (int i=0;i<dol.size();i++) + { + if (dol[i] == thisob) + { + sprintf(temp1,"#/%s.%d",name,i); + break; + } + } + } + else { + sprintf(temp1,"#/%s",name); + } + if (asXPathBuffer != 0) { + temp2 = new char[strlen(asXPathBuffer) + strlen(temp1) + 1]; + sprintf(temp2,"%s%s", temp1, asXPathBuffer+1 ); + delete asXPathBuffer; + } + else { + temp2 = new char[strlen(temp1) + 1]; + sprintf(temp2,"%s", temp1); + } + delete temp1; + asXPathBuffer = temp2; + thisob = dob; + dob = dob->getContainerImpl(); + } + return asXPathBuffer; */ + } + + // user data support... + void* DataObjectImpl::getUserData(const char* path) + { + DataObjectImpl *d; + void* v = 0; + char *spath = 0; + char* prop = 0; + try { + spath = DataObjectImpl::stripPath(path); + prop = findPropertyContainer(spath,&d); + if (spath) + { + delete spath; + spath = 0; + } + if (d != 0) + { + if (prop != 0) + { + const Property& p = d->getProperty(prop); + if (p.getType().isDataType()) return 0; + if (p.isMany()) + { + DataObjectImpl* d2 = d->getDataObjectImpl(prop); + if (d2) v = d2->getUserData(); + delete prop; + prop = 0; + return v; + } + v = d->getUserData(p); + delete prop; + prop = 0; + return v; + } + return d->getUserData(); + } + return 0; + } + catch (SDORuntimeException e) + { + if (prop) delete prop; + if (spath) delete spath; + return 0; + } + + } + + void* DataObjectImpl::getUserData(unsigned int propertyIndex) + { + if ((getProperty(propertyIndex).isMany())) + { + return 0; + } + if ((getProperty(propertyIndex).getType().isDataType())) + { + return 0; + } + DataObjectImpl* ptr = getDataObjectImpl(propertyIndex); + if (ptr) return ptr->getUserData(); + return 0; + } + + void* DataObjectImpl::getUserData(const Property& property) + { + if (property.isMany()) + { + return 0; + } + if (property.getType().isDataType()) + { + return 0; + } + DataObjectImpl* ptr = getDataObjectImpl(property); + if (ptr) return ptr->getUserData(); + return 0; + } + + void* DataObjectImpl::getUserData() + { + return userdata; + } + + void DataObjectImpl::setUserData(const char* path, void* value) + { + char *spath = 0; + char* prop = 0; + DataObjectImpl *d; + try { + spath = DataObjectImpl::stripPath(path); + prop = findPropertyContainer(spath,&d); + if (spath) + { + delete spath; + spath = 0; + } + if (d != 0) + { + if (prop != 0) + { + const Property& p = d->getProperty(prop); + if (p.getType().isDataType()) return; + if (p.isMany()) + { + DataObjectImpl* d2 = d->getDataObjectImpl(prop); + if (d2) d2->setUserData(value); + delete prop; + prop = 0; + return; + } + d->setUserData(p,value); + delete prop; + prop = 0; + return; + } + d->setUserData(value); + return; + } + } + catch (SDORuntimeException e) + { + if (prop) delete prop; + if (spath) delete spath; + return; + } + + } + + void DataObjectImpl::setUserData(unsigned int propertyIndex, void* value) + { + if ((getProperty(propertyIndex).isMany())) + { + return; + } + if ((getProperty(propertyIndex).getType().isDataType())) + { + return; + } + DataObjectImpl* ptr = getDataObjectImpl(propertyIndex); + if (ptr) ptr->setUserData(value); + return; + } + + void DataObjectImpl::setUserData(const Property& property, void* value) + { + if (property.isMany()) + { + return; + } + if (property.getType().isDataType()) + { + return; + } + DataObjectImpl* ptr = getDataObjectImpl(property); + if (ptr) ptr->setUserData(value); + return; + } + + void DataObjectImpl::setUserData(void* value) + { + userdata = value; + } + +}; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.h new file mode 100644 index 0000000000..b3a0d7dd13 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.h @@ -0,0 +1,683 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/03/07 11:05:20 $ */ + +#ifndef _DATAOBJECTIMPL_H_ +#define _DATAOBJECTIMPL_H_ +#include "commonj/sdo/DataObject.h" + +#include "commonj/sdo/disable_warn.h" + +#include <ctime> +#include <list> +#include <map> + +#include <string> + + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/TypeImpl.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/SequenceImpl.h" +#include "commonj/sdo/DataObjectListImpl.h" +#include "commonj/sdo/PropertyList.h" + +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/ChangeSummaryImpl.h" +#include "commonj/sdo/SDODate.h" + +namespace commonj{ +namespace sdo{ + +class DataGraph; +class DataObjectImpl; +class DataObjectListImpl; +class DataFactory; + + +#define DataObjectImplPtr RefCountingPointer<DataObjectImpl> +#define ChangeSummaryImplPtr RefCountingPointer<ChangeSummaryImpl> + +/** + * rdo is an internal class holding a property value in a data object. + */ + +class rdo { +public: + unsigned int first; + DataObjectImplPtr second; + rdo(unsigned int infirst, DataObjectImpl* insecond); + rdo(); + rdo (const rdo& inrdo); + virtual ~rdo(); +}; + +typedef std::list< rdo > PropertyValueMap; + + + /** + * DataObjectImpl implements the abstract class DataObject. + * + * A data object is a representation of some structured data. + * it is the fundamental component in the SDO (Service Data Objects) package. + * Data objects support reflection, path-based accesss, convenience creation + * and deletion methods,and the ability to be part of a data graph. + * Each data object holds its data as a series of properties. + * Properties can be accessed by name, property index, or using the property + * meta object itself. + * A data object can also contain references to other data objects, through + * reference-type properties. + * A data object has a series of convenience accessors for its properties. + * These methods either use a path (String), a property index, + * or the property's meta object itself, to identify the property. + * Some examples of the path-based accessors are as follows: + * DataObjectPtr company = ...; + * company->getString("name"); + * company->setString("name", "acme"); + * company->getString("department.0/name") + * .n indexes from 0. + * company->getString("department[1]/name") [] indexes from 1. + * company->getDataObject("department[number=123]") returns the department where number=123 + * company->getDataObject("..") returns the containing data object + * company->getDataObject("/") returns the root containing data object + * There are specific accessors for the primitive types and commonly used + * data types like String. + */ + +class DataObjectImpl : public DataObject +{ + public: + + DataObjectImpl(); + DataObjectImpl(const TypeImpl& t); + DataObjectImpl(DataFactory* dataFactory, const Type& t); + + // This one only needs the values, and the type/prop info. The rest + // is not copied and would be unsafe to do so. This is used to + // store the cloned info in a change summary. + + DataObjectImpl(DataObjectImplPtr indo); + + virtual ~DataObjectImpl(); + + ///////////////////////////////////////////////////////////////////////// + // Introspection + ///////////////////////////////////////////////////////////////////////// + + + void handlePropertyNotSet(const char* name); + + /** getPropertyIndex gets the unique index of a property + * + * A property of a data object has a unique index associated with it. + * This method gets a property index for this object from the property, + * or throw SDOPropertyNotFoundException if the property is not part + * of this data object. + */ + + virtual unsigned int getPropertyIndex(const Property& p); + + /** + * These are just like getType().getProperty(), but may return + * values other than the property list for open types. + */ + + virtual const Property& getProperty(unsigned int index); + + virtual const Property& getProperty(const char* prop); + virtual const Property& getProperty(const SDOString& prop); + + virtual PropertyImpl* getPropertyImpl(const char* prop); + virtual PropertyImpl* getPropertyImpl(const SDOString& prop); + + virtual PropertyImpl* getPropertyImpl(unsigned int index); + + /** getInstanceProperties gets the props of the current object. + * + * Returns a read-only List of the Properties currently used in this DataObject. + * This list will contain all of the properties in getType().getProperties() + * and any properties where isSet(property) is true. + * For example, properties resulting from the use of + * open or mixed XML content are present if allowed by the Type. + * The list does not contain duplicates. + * The order of the properties in the list begins with getType().getProperties() + * and the order of the remaining properties is determined by the implementation. + * The same list will be returned unless the DataObject is updated so that + * the contents of the list change + * Returns the list of Properties currently used in this DataObject. + */ + + virtual PropertyList getInstanceProperties(); + + /** getContainer get the containing object + * + * Returns the containing data object + * or 0 if there is no container. + */ + + virtual DataObjectPtr getContainer(); + + /** getContainmentProperty returns the property containing this object + * + * Return the Property of the data object containing this data object + * or throw an SDOPropertyNotFoundException if there is no container. + */ + + virtual const Property& getContainmentProperty(); + + /** getType returns the data object's type. + * + * getType returns the data object's type. + * The type defines the properties available for reflective access. + */ + + virtual const Type& getType(); + + virtual const Type::Types getTypeEnum(); + + + + /////////////////////////////////////////////////////////////////////////// + // get/set + /////////////////////////////////////////////////////////////////////////// + + + /** getDataObject returns a data object by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual DataObjectPtr getDataObject(const SDOString& path); + virtual DataObjectPtr getDataObject(const char* path); + virtual DataObjectPtr getDataObject(unsigned int propertyIndex); + virtual DataObjectPtr getDataObject(const Property& property); + + /** setDataObject sets a value by path, index or property + * + * Sets a property of either this object or an object reachable from it, + * as identified by the specified path, + * to the specified value. + */ + + virtual void setDataObject(const char* path, DataObjectPtr value); + virtual void setDataObject(const SDOString& path, DataObjectPtr value); + virtual void setDataObject(unsigned int propertyIndex, DataObjectPtr value); + virtual void setDataObject(const Property& property, DataObjectPtr value); + + /** getBoolean returns a boolean by path, index or property + * + * Returns the value of a property of either this object or an object + * reachable from it, as identified by the specified path. + */ + + virtual bool getBoolean(const char* path); + virtual bool getBoolean(const SDOString& path); + virtual bool getBoolean(unsigned int propindex); + virtual bool getBoolean(const Property& p); + + virtual void setBoolean(const char* path, bool b); + virtual void setBoolean(unsigned int propindex, bool b); + virtual void setBoolean(const Property& p, bool b); + + virtual char getByte(const char* path); + virtual char getByte(unsigned int propindex); + virtual char getByte(const Property& p); + + virtual void setByte(const char* path, char c); + virtual void setByte(unsigned int propindex, char c); + virtual void setByte(const Property& p, char c); + + virtual wchar_t getCharacter(const char* path); + virtual wchar_t getCharacter(unsigned int propindex); + virtual wchar_t getCharacter(const Property& p); + + virtual void setCharacter(const char* path, wchar_t c); + virtual void setCharacter(unsigned int propindex, wchar_t c); + virtual void setCharacter(const Property& p, wchar_t c); + + virtual unsigned int getLength(const char* path) ; + virtual unsigned int getLength(unsigned int propindex) ; + virtual unsigned int getLength(const Property& p) ; + virtual unsigned int getLength() ; + + virtual unsigned int getBytes(const char* path, char* buf, unsigned int max) ; + virtual unsigned int getBytes(unsigned int propindex, char* buf, unsigned int max) ; + virtual unsigned int getBytes(const Property& p, char* buf, unsigned int max) ; + + virtual void setBytes(const char* path, const char* c, unsigned int len) ; + virtual void setBytes(unsigned int propindex, const char* c,unsigned int len) ; + virtual void setBytes(const Property& p, const char* c,unsigned int len) ; + + virtual unsigned int getString(const char* path, wchar_t* buf, unsigned int max) ; + virtual unsigned int getString(unsigned int propindex,wchar_t* buf, unsigned int max) ; + virtual unsigned int getString(const Property& p,wchar_t* buf, unsigned int max) ; + + virtual void setString(const char* path, const wchar_t* c,unsigned int len) ; + virtual void setString(unsigned int propindex, const wchar_t* c,unsigned int len) ; + virtual void setString(const Property& p, const wchar_t* c,unsigned int len) ; + + virtual const SDODate getDate(const char* path); + virtual const SDODate getDate(unsigned int propindex); + virtual const SDODate getDate(const Property& p); + + virtual void setDate(const char* path, const SDODate d); + virtual void setDate(unsigned int propindex, const SDODate d); + virtual void setDate(const Property& p, const SDODate d); + + virtual long double getDouble(const char* path); + virtual long double getDouble(unsigned int propindex); + virtual long double getDouble(const Property& p); + + virtual void setDouble(const char* path, long double d); + virtual void setDouble(unsigned int propindex, long double d); + virtual void setDouble(const Property& p, long double d); + + virtual float getFloat(const char* path); + virtual float getFloat(unsigned int propindex); + virtual float getFloat(const Property& p); + + virtual void setFloat(const char* path, float f); + virtual void setFloat(unsigned int propindex, float f); + virtual void setFloat(const Property& p, float f); + + virtual long getInteger(const char* path); + virtual long getInteger(unsigned int propindex); + virtual long getInteger(const Property& p); + + virtual void setInteger(const char* path, long i); + virtual void setInteger(unsigned int propindex, long i); + virtual void setInteger(const Property& p, long i); + + virtual /*long long*/ int64_t getLong(const char* path); + virtual /*long long*/ int64_t getLong(unsigned int propindex); + virtual /*long long*/ int64_t getLong(const Property& p); + + virtual void setLong(const char* path, /*long long*/ int64_t l); + virtual void setLong(unsigned int propindex, /*long long*/ int64_t l); + virtual void setLong(const Property& p, /*long long*/ int64_t l); + + virtual short getShort(const char* path); + virtual short getShort(unsigned int propindex); + virtual short getShort(const Property& p); + + virtual void setShort(const char* path, short s); + virtual void setShort(unsigned int propindex, short s); + virtual void setShort(const Property& p, short s); + + virtual const char* getCString(const char* path); + virtual const char* getCString(unsigned int propertyIndex); + virtual const char* getCString(const Property& prop); + + virtual void setCString(const char* path, const char* value); + virtual void setCString(unsigned int propertyIndex, const char* value); + virtual void setCString (const Property& prop, const char* value); + + /** setNull sets a data object value to null. + * + * A DataObjectType or DataType value may be set or unset. If it is set, then + * it may have a value, or it may be set to null. A distinction is drawn between + * being unset, having the default value, being set and being null. + * When the value of an integer (for example) is returned as zero, it could have + * been set to zero, or it could be null. Use isNull() to verify. + */ + + virtual void setNull(const char* path); + virtual void setNull(unsigned int propertyIndex); + virtual void setNull(const Property& prop); + + virtual bool isNull(const char* path); + virtual bool isNull(unsigned int propertyIndex); + virtual bool isNull(const Property& prop); + + virtual bool isSet(const char* path); + virtual bool isSet(unsigned int propertyIndex); + virtual bool isSet(const Property& property); + + virtual bool isValid(const char* path); + virtual bool isValid(unsigned int propertyIndex); + virtual bool isValid(const Property& property); + + virtual void unset(const char* path); + virtual void unset(unsigned int propertyIndex); + virtual void unset(const Property& property); + + + /////////////////////////////////////////////////////////////////////////// + // Sequences + /////////////////////////////////////////////////////////////////////////// + + /** getSequence returns the sequence for a data object + * + * Returns the value of a Sequence property identified by + * the specified path. See Sequence. + */ + + virtual SequenceImpl* getSequenceImpl(); + virtual SequencePtr getSequence(); + virtual SequencePtr getSequence(const char* path); + virtual SequencePtr getSequence(unsigned int propertyIndex); + virtual SequencePtr getSequence(const Property& property); + + + /////////////////////////////////////////////////////////////////////////// + // Creation of dataobjects + /////////////////////////////////////////////////////////////////////////// + + /** createDataObject creates a data object value + * + * Returns a new data object contained by this object using the + * specified property,which must be a containment property. + * The type of the created object is the declared type + * of the specified property. + * If the property is many valued, this method adds an element to the + * list, otherwise it sets the value, removing any old value. + */ + + virtual DataObjectPtr createDataObject(const char* propertyName); + virtual DataObjectPtr createDataObject(unsigned int propertyIndex); + virtual DataObjectPtr createDataObject(const Property& property); + + + /** + * See if the property currently exists + */ + + virtual bool hasProperty(const char* name); + virtual bool hasProperty(const SDOString& name); + + + virtual void detach(); + + virtual void clear(); + + + /////////////////////////////////////////////////////////////////////////// + // Lists + /////////////////////////////////////////////////////////////////////////// + + /** getList gets the value of a many-valued property + * + * Many valued properties are returned as lists of DataObjects. + * These lists may contain primitives or data objects, but they behave + * like data objects. + * Getting a many valued integer consists of getting the list, then + * using the DataObjectList API to getInteger() for each list element. + */ + + virtual DataObjectList& getList(const char* path); + virtual DataObjectList& getList(unsigned int propIndex); + virtual DataObjectList& getList(const Property& p); + virtual DataObjectList& getList(); + virtual DataObjectListImpl* getListImpl(); + + void setList( DataObjectList* theList); + + /////////////////////////////////////////////////////////////////////////// + // Change Summary + /////////////////////////////////////////////////////////////////////////// + + /** getChangeSummary get the applicable change summary + * + * This method gets the applicable change summary for a data object. + * The summary is not necessarily attached to the data object, it may be + * the summary for a parent data object. No object with a summary attached + * may be a child of another object with a summary attached. + * See the ChangeSummary API for details of using the change sumamry. + */ + + virtual SDO_API ChangeSummaryPtr getChangeSummary(const char* path); + virtual SDO_API ChangeSummaryPtr getChangeSummary(unsigned int propIndex); + virtual SDO_API ChangeSummaryPtr getChangeSummary(const Property& prop); + virtual SDO_API ChangeSummaryPtr getChangeSummary(); + + + virtual bool getBoolean(); + virtual void setBoolean(bool b); + virtual char getByte(); + virtual void setByte(char c); + virtual wchar_t getCharacter(); + virtual void setCharacter(wchar_t c); + virtual unsigned int getString(wchar_t* buf, unsigned int max); + virtual unsigned int getBytes(char* buf, unsigned int max); + virtual void setString(const wchar_t* buf, unsigned int len); + virtual void setBytes(const char* c, unsigned int len); + virtual short getShort(); + virtual void setShort(short s); + virtual long getInteger(); + virtual void setInteger(long s); + virtual /* long long*/ int64_t getLong(); + virtual void setLong(/* long long */ int64_t i); + virtual float getFloat(); + virtual void setFloat(float b); + virtual long double getDouble(); + virtual void setDouble(long double d); + virtual const SDODate getDate(); + virtual void setDate(const SDODate d); + virtual const char* getCString(); + virtual void setCString(const char* s); + virtual DataObjectImpl* getDataObject(); + virtual void setDataObject(DataObject* d); + + // null support + virtual bool isNull(); + virtual void setNull(); + virtual void unsetNull(); + + // change logging is used by the dataobjectlistimpl + virtual void logChange(const Property& prop); + virtual void logChange(unsigned int propIndex); + virtual void logDeletion(); + virtual void logCreation(DataObjectImpl* dol, + DataObjectImpl* cont, const Property& prop); + + // reference support + virtual void setReference(DataObject* dob, const Property& prop); + virtual void unsetReference(DataObject* dob, const Property& prop); + virtual void clearReferences(); + + // user data support + virtual void setUserData(const char* path,void* value); + virtual void setUserData(unsigned int propertyIndex, void* value); + virtual void setUserData(const Property& property, void* value); + virtual void setUserData(void* value); + virtual void* getUserData(const char* path); + virtual void* getUserData(unsigned int propertyIndex); + virtual void* getUserData(const Property& property); + virtual void* getUserData(); + + virtual void setContainer(DataObjectImpl* d); + DataObjectImpl* getContainerImpl(); + + // builds a temporary XPath for this object. + const char* objectToXPath(); + + // The data factory can be used to create new data objects within + // the Type system of this data object + // + + SDO_API DataFactory* getDataFactory(); + + + // cache a copy of the change summary in this data object, if there + // is one in the tree. + + virtual void setApplicableChangeSummary(); + + + // open type support + virtual void setInstancePropertyType(unsigned int index, + const Type* t); + + /** + * defineProperty is used by open type support. + * This method and its siblings define a new property on an + * open type when a setting is requested. + */ + + virtual const PropertyImpl* defineProperty(const char* propname, + const Type& t); + virtual const PropertyImpl* defineProperty(const SDOString& propname, + const Type& t); + + virtual const PropertyImpl* defineBoolean(const char* propname); + virtual const PropertyImpl* defineByte(const char* propname); + virtual const PropertyImpl* defineCharacter(const char* propname); + virtual const PropertyImpl* defineString(const char* propname); + virtual const PropertyImpl* defineBytes(const char* propname); + virtual const PropertyImpl* defineShort(const char* propname); + virtual const PropertyImpl* defineInteger(const char* propname); + virtual const PropertyImpl* defineLong(const char* propname); + virtual const PropertyImpl* defineFloat(const char* propname); + virtual const PropertyImpl* defineDouble(const char* propname); + virtual const PropertyImpl* defineDate(const char* propname); + virtual const PropertyImpl* defineCString(const char* propname); + virtual const PropertyImpl* defineDataObject(const char* propname, + const Type&t ); + virtual const PropertyImpl* defineDataObject(const SDOString& propname, + const Type&t ); + virtual const PropertyImpl* defineDataObject(const char* propname, + const char* typeURI, const char* typeName ); + virtual const PropertyImpl* defineList(const char* propname); + virtual void undefineProperty(unsigned int index); + virtual const TypeImpl& getTypeImpl(); + virtual void transferChildren(DataObject* d, DataFactory* f); + virtual void setDataFactory(DataFactory *df); + +private: + + virtual void validateIndex(unsigned int index); + virtual void checkFactory(DataObjectPtr dob, unsigned int propertyIndex); + virtual void checkType( const Property& prop, + const Type& objectType); + + virtual bool remove(DataObjectImpl* indol); + virtual bool isSet(const Property& prop, unsigned int propertyIndex); + + + virtual DataObjectImpl* getDataObjectImpl(const SDOString& path); + virtual DataObjectImpl* getDataObjectImpl(const char* path); + virtual DataObjectImpl* getDataObjectImpl(unsigned int propertyIndex); + virtual DataObjectImpl* getDataObjectImpl(const Property& property); + + virtual DataObjectPtr + createDataObject(const Property& property, + const char* namespaceURI, + const char* typeName); + + DataObjectImpl* findDataObject(char* token, long* index); + DataObjectImpl* findDataObject(const SDOString& token, long* index); + const Property* findInProperties(DataObject* ob); + char* findPropertyContainer(const char* path, DataObjectImpl** din); + SDOString findPropertyContainer(const SDOString& path, DataObjectImpl** din); + char* stripPath(const char* path); + void stripPath(const SDOString& path, SDOString& result); + + + // Does not keep a reference counted pointer to the container. + DataObjectImpl* container; + + // remove the value from the data object. + void deleteValue(); + + + PropertyValueMap PropertyValues; + + TypeImpl* ObjectType; + + DataObjectListImpl* listValue; + + // Holds the value , reallocated as necessary for strings + void* value; + + // In the case of a bytes/string - this holds the length; + unsigned int valuelength; + + // holds the value as a string - if requested. + char* asStringBuffer; + + // holds the Xpath to this object if requested. + std::string asXPathBuffer; + + // The data object holds a counted reference to the data factory. + DataFactoryPtr factory; + + + // Support for open types + int openBase; + std::list<PropertyImpl> openProperties; + + static const char* emptyString; + static const char* templateString; + + // Data may be set to null in any data object + bool isnull; + + // user supplied 32 bit value. + void* userdata; + + // + // The sequence, if this is a sequenced type - not + // reference counted by the data object + // + SequenceImpl* sequence; + + // + // The change summary if this is a summarised type + // not reference counted by the data object - only by + // clients + // + + ChangeSummaryImpl* getChangeSummaryImpl(); + ChangeSummaryImpl* getSummary(); + ChangeSummaryImpl* localCS; + DataObjectImpl* changesummaryobject; + + + // reference type support + + class Reference + { + public: + DataObject* getDataObject() + { + return referer; + } + const Property& getProperty() + { + return refprop; + } + Reference(DataObject* d, const Property& p) : refprop(p), referer(d) + { + } + private: + DataObject* referer; + const Property& refprop; + }; + + typedef std::vector<Reference*> REFERENCE_LIST; + + REFERENCE_LIST refs; + + + +}; +}; +}; + +#endif //_DATAOBJECTIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectInstance.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectInstance.cpp new file mode 100644 index 0000000000..67f54949c8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectInstance.cpp @@ -0,0 +1,69 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/DataObjectInstance.h" +using commonj::sdo::CopyHelper; + + + +namespace commonj +{ + namespace sdo + { + // ============ + // Constructors + // ============ + DataObjectInstance::DataObjectInstance() + { + } + + DataObjectInstance::DataObjectInstance(const DataObjectPtr& theDO) + { + dataObject = CopyHelper::copy(theDO); + } + + // ========== + // Destructor + // ========== + DataObjectInstance::~DataObjectInstance() + { + } + + // =================================== + // Copy constructor: deep copy the DO + // =================================== + DataObjectInstance::DataObjectInstance(const DataObjectInstance& doi) + { + dataObject = CopyHelper::copy(doi.dataObject); + } + + // ============================= + // operator= : deep copy the DO + // ============================= + DataObjectInstance& DataObjectInstance::operator=(const DataObjectInstance& doi) + { + if (this != &doi) + { + dataObject = CopyHelper::copy(doi.dataObject); + } + return *this; + } + + } // End namespace sca +} // End namespace osoa diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectInstance.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectInstance.h new file mode 100644 index 0000000000..766392fbaa --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectInstance.h @@ -0,0 +1,62 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef commonj_sdo_DataObjectInstance_h +#define commonj_sdo_DataObjectInstance_h + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/SDO.h" +using commonj::sdo::DataObjectPtr; +using commonj::sdo::DataObject; + + +namespace commonj +{ + namespace sdo + { +/** + * DataObjectInstance is a class which allows DataObjects to be considered + * as instances rather than data object pointers. + */ + class DataObjectInstance + { + + public: + SDO_API DataObjectInstance(); + SDO_API virtual ~DataObjectInstance(); + + SDO_API DataObjectInstance(const DataObjectPtr& theDO); + SDO_API DataObjectInstance(const DataObjectInstance&); + + SDO_API DataObjectInstance& operator=(const DataObjectInstance&); + SDO_API bool operator!() {return (!dataObject);} + SDO_API operator bool() {return !!dataObject;} + + SDO_API DataObject* operator->() {return dataObject;} + + SDO_API DataObjectPtr getDataObject() {return dataObject;} + SDO_API operator DataObjectPtr() {return dataObject;} + private: + DataObjectPtr dataObject; + }; + } // End namespace sdo +} // End namespace commonj + +#endif // commonj_sdo_DataObjectInstance_h diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectList.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectList.cpp new file mode 100644 index 0000000000..7202833360 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectList.cpp @@ -0,0 +1,41 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/DataObjectList.h" + +namespace commonj{ +namespace sdo { + +/** + * + * List for retrieving many valued property values. + * + * DataObjectList provides an API for getting and setting values in + * many valued properties. The list deals with both DataType and + * DataObjectType properties. + */ + +DataObjectList::~DataObjectList() +{ + +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectList.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectList.h new file mode 100644 index 0000000000..04ad42b3c0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectList.h @@ -0,0 +1,194 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/06 12:58:18 $ */ + +#ifndef _DATAOBJECTLIST_H_ +#define _DATAOBJECTLIST_H_ + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SDODate.h" +#include <wchar.h> + + +namespace commonj{ +namespace sdo{ + +/** + * + * List for retrieving many valued property values, DataType or DataObjectType. + * + * DataObjectList provides an API for getting and setting values in + * many valued properties. The list deals with both DataType and + * DataObjectType properties. + */ + +class DataObjectList +{ +public: + virtual ~DataObjectList(); + + /** [] is a index operator, and returns a dataobject. + * + * The index operator returns a data object, even if the + * list is of a DataType. The data object can yield its true value using + * getInteger() etc. Alternatively, list elements can be accessed + * with their correct type using the list getInteger(index) api. + */ + + virtual SDO_API DataObjectPtr operator[] (int pos) = 0; + virtual SDO_API const DataObjectPtr operator[] (int pos) const = 0; + + /** size returns the number of elements. + * + * The size method returns the number of elements in the list + */ + + virtual SDO_API int size () const = 0; + + /** getBoolean returns a boolean at an index + * + * Each of the DataTypes has a corresponding getter and setter + * overload. getBoolean returns a bool, getByte returns a char + * etc + */ + + virtual SDO_API bool getBoolean(unsigned int index) const = 0; + virtual SDO_API char getByte(unsigned int index) const = 0; + virtual SDO_API wchar_t getCharacter(unsigned int index) const = 0; + virtual SDO_API unsigned int getString(unsigned int index, wchar_t* value, + unsigned int max) const = 0; + virtual SDO_API unsigned int getBytes(unsigned int index, char* value, + unsigned int max) const = 0; + virtual SDO_API short getShort(unsigned int index) const = 0; + virtual SDO_API long getInteger(unsigned int index) const = 0; + virtual SDO_API int64_t getLong(unsigned int index) const = 0; + virtual SDO_API float getFloat(unsigned int index) const = 0; + virtual SDO_API long double getDouble(unsigned int index) const = 0; + virtual SDO_API const SDODate getDate(unsigned int index) const = 0; + virtual SDO_API const char* getCString(unsigned int index) const = 0; + virtual SDO_API DataObjectPtr getDataObject(unsigned int index) const = 0; + + virtual SDO_API void setBoolean(unsigned int index, bool d) = 0; + virtual SDO_API void setByte(unsigned int index, char d) = 0; + virtual SDO_API void setCharacter(unsigned int index, wchar_t d) = 0; + virtual SDO_API void setString(unsigned int index, const wchar_t* d, unsigned int len) = 0; + virtual SDO_API void setBytes(unsigned int index, const char* d, unsigned int len) = 0; + virtual SDO_API void setShort(unsigned int index, short d) = 0; + virtual SDO_API void setInteger(unsigned int index, long d) = 0; + virtual SDO_API void setLong(unsigned int index, int64_t d) = 0; + virtual SDO_API void setFloat(unsigned int index, float d) = 0; + virtual SDO_API void setDouble(unsigned int index, long double d) = 0; + virtual SDO_API void setDate(unsigned int index, const SDODate d) = 0; + virtual SDO_API void setCString(unsigned int index, char* d) = 0; + virtual SDO_API void setDataObject(unsigned int index, DataObjectPtr dob) = 0; + + /** getLength returns the length of a string element + * + * getLength behaves like DataObject::getlength. It returns the length + * of a bytes or string buffer such that space can be allocated for the + * values from getBytes() and getString() + */ + + virtual SDO_API unsigned int getLength(unsigned int index) const = 0; + + /** insert and append put items into the list + * + * insert and append have overrides for each of the DataTypes, and + * for DataObject. Insert inserts before the element number given. If the insertion + * point is off the end of the list, then an append is performed. + * Append puts the element on the end of the list. + */ + + + virtual SDO_API void insert (unsigned int index, DataObjectPtr d) = 0; + virtual SDO_API void append (DataObjectPtr d) = 0; + + virtual SDO_API void insert (unsigned int index, bool d) = 0; + virtual SDO_API void append (bool d) = 0; + + virtual SDO_API void insert (unsigned int index, char d) = 0; + virtual SDO_API void append (char d) = 0; + + virtual SDO_API void insert (unsigned int index, wchar_t d) = 0; + virtual SDO_API void append (wchar_t d) = 0; + + virtual SDO_API void insert (unsigned int index, const wchar_t* d, unsigned int len) = 0; + virtual SDO_API void append (const wchar_t* d, unsigned int len) = 0; + + virtual SDO_API void insert (unsigned int index, const char* d, unsigned int len) = 0; + virtual SDO_API void append (const char* d, unsigned int len) = 0; + + virtual SDO_API void insert (unsigned int index, const char* d) = 0; + virtual SDO_API void append (const char* d) = 0; + + virtual SDO_API void insert (unsigned int index, short d) = 0; + virtual SDO_API void append (short d) = 0; + + virtual SDO_API void insert (unsigned int index, const SDODate d) = 0; + virtual SDO_API void append (const SDODate d) = 0; + +#if __WORDSIZE !=64 + virtual SDO_API void insert (unsigned int index, long d) = 0; + virtual SDO_API void append (long d) = 0; +#endif + + virtual SDO_API void insert (unsigned int index, int64_t d) = 0; + virtual SDO_API void append (int64_t d) = 0; + + virtual SDO_API void insert (unsigned int index, float d) = 0; + virtual SDO_API void append (float d) = 0; + + + virtual SDO_API void insert (unsigned int index, long double d) = 0; + virtual SDO_API void append (long double d) = 0; + + /** remove removes an element from the list. + * + * Remove removes the element from the list, and passes out a + * DataObjectPtr to the old value. This can be attached to the list + * somewhere else, or discarded. + */ + + virtual SDO_API DataObjectPtr remove (unsigned int index) = 0; + + /* getType returns type + * + * Returns the type. + * May throw SDOTYpeNotFoundException for unset open types + */ + + + virtual SDO_API const Type& getType() = 0; + + /* getTypeEnum returns an enumerator for the type + * + * Returns an enumerator for the type for easy switching on basic types. + * The enumerator is part of the Type class + * May throw SDOTypeNotFoundException for open types + */ + + virtual SDO_API const Type::Types getTypeEnum() = 0; + +}; +}; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectListImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectListImpl.cpp new file mode 100644 index 0000000000..25ef2a266b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectListImpl.cpp @@ -0,0 +1,1102 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/07 13:35:33 $ */ + +#include "commonj/sdo/DataObjectListImpl.h" + + +#include <iostream> +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/Logger.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/DataObjectImpl.h" +#include "commonj/sdo/DataFactoryImpl.h" + +#include <stdio.h> + +namespace commonj{ +namespace sdo { + +/** + * DataObjectListImpl implements DataObjectList. + * List for retrieving many valued property values. + * + * DataObjectList provides an API for getting and setting values in + * many valued properties. The list deals with both DataType and + * DataObjectType properties. + */ +DataObjectListImpl::DataObjectListImpl(DATAOBJECT_VECTOR p) : plist (p) +{ + theFactory = 0; + container = 0; + pindex = 0; + isReference = false; +} + +DataObjectListImpl::DataObjectListImpl(const DataObjectListImpl &pin) +{ + plist = std::vector<RefCountingPointer<DataObjectImpl> >(pin.getVec()); + theFactory = pin.theFactory; + container = pin.container; + pindex = pin.pindex; + typeUnset = pin.typeUnset; + isReference = pin.isReference; + if (pin.typeURI != 0) { + typeURI = new char[strlen(pin.typeURI) +1]; + strcpy(typeURI, pin.typeURI); + } + if (pin.typeName != 0) { + typeName = new char[strlen(pin.typeName) +1]; + strcpy(typeName, pin.typeName); + } +} + +DataObjectListImpl::DataObjectListImpl() +{ + theFactory = 0; + typeURI = 0; + typeName = 0; + theFactory = 0; + container = 0; + pindex = 0; + typeUnset = false; + isReference = false; +} + +DataObjectListImpl::DataObjectListImpl(DataFactory* df, + DataObjectImpl* cont, + unsigned int inpindex, + const char* intypeURI, + const char* intypeName) +{ + container = cont; + pindex = inpindex; + theFactory = df; + + + isReference = false; + if (container->getProperty(pindex).isReference()) + { + isReference = true; + } + typeUnset = false; + + if (container->getType().isOpenType()) + { + if (!strcmp(intypeURI,Type::SDOTypeNamespaceURI.c_str()) && + !strcmp(intypeName,"OpenDataObject")) + { + typeUnset = true; + } + } + + + if (intypeURI != 0) { + typeURI = new char[strlen(intypeURI) +1]; + strcpy(typeURI, intypeURI); + } + else { + typeURI = 0; + } + if (intypeName != 0) { + typeName = new char[strlen(intypeName) +1]; + strcpy(typeName, intypeName); + } + else { + typeName = 0; + theFactory = 0; + } +} + +DataObjectListImpl::~DataObjectListImpl() +{ + if (typeURI != 0) { + delete typeURI; + typeURI = 0; + } + if (typeName != 0) { + delete typeName; + typeName = 0; + } +} + +RefCountingPointer<DataObject> DataObjectListImpl::operator[] (int pos) +{ + validateIndex(pos); + return plist[pos]; +} + +const RefCountingPointer<DataObject> DataObjectListImpl::operator[] (int pos) const +{ + validateIndex(pos); + RefCountingPointer<DataObjectImpl> d = plist[pos]; + DataObjectImpl* dob = d; + return RefCountingPointer<DataObject>((DataObject*)dob); +} + + +int DataObjectListImpl::size () const +{ + return plist.size(); +} + +DATAOBJECT_VECTOR DataObjectListImpl::getVec() const +{ + return plist; +} + + + +const Type& DataObjectListImpl::getType() +{ + if (typeUnset) + { + std::string msg("The list property is open, and the type of the contents has not bee determined yet."); + SDO_THROW_EXCEPTION("Get Type", SDOTypeNotFoundException, + msg.c_str()); + } + return theFactory->getType(typeURI, typeName); +} + + +const Type::Types DataObjectListImpl::getTypeEnum() +{ + if (typeUnset) + { + return Type::OpenDataObjectType; + + } + return theFactory->getType(typeURI, typeName).getTypeEnum(); +} + + +void DataObjectListImpl::insert (unsigned int index, DataObjectPtr d) +{ + if (typeUnset)setType(d->getType().getURI(),d->getType().getName()); + + checkFactory(d); + + checkType(theFactory->getType(typeURI,typeName), + d->getType()); + + if (container != 0) + { + container->logChange(pindex); + } + for (int i=0;i < plist.size(); i++) + { + if (plist[i] == d) + { + std::string msg("Insertion of object which already exists in the list:"); + msg += typeURI; + msg += " "; + msg += typeName; + SDO_THROW_EXCEPTION("List insert", SDOUnsupportedOperationException, + msg.c_str()); + } + } + if (strcmp(typeURI,d->getType().getURI()) + || + strcmp(typeName,d->getType().getName())) + { + std::string msg("Insertion of object of the wrong type to a list:"); + msg += typeURI; + msg += " "; + msg += typeName; + msg += " not compatible with "; + msg += d->getType().getURI(); + msg += " "; + msg += d->getType().getName(); + SDO_THROW_EXCEPTION("List append", SDOInvalidConversionException, + msg.c_str()); + } + + DataObject* dob = d; // unwrap the data object ready for a downcasting hack. + DataObjectImpl* con = ((DataObjectImpl*)dob)->getContainerImpl(); + if (!isReference) + { + if (con != 0) + { + if (con != container) + { + /* this data object is already contained somewhere else */ + std::string msg("Insertion of object to list, object is already contained:"); + msg += d->getType().getURI(); + msg += " "; + msg += d->getType().getName(); + SDO_THROW_EXCEPTION("List append", SDOInvalidConversionException, + msg.c_str()); + } + } + else + { + ((DataObjectImpl*)dob)->setContainer(container); + ((DataObjectImpl*)dob)->setApplicableChangeSummary(); + ((DataObjectImpl*)dob)->logCreation((DataObjectImpl*)dob, + (DataObjectImpl*)container, + container->getProperty(pindex)); + } + } + + plist.insert(plist.begin()+index, RefCountingPointer<DataObjectImpl>((DataObjectImpl*)dob)); + + if (container != 0) + { + if (container->getType().isSequencedType()) + { + SequenceImpl* sq = container->getSequenceImpl(); + if (sq)sq->push(container->getProperty(pindex),index); + } + } + +} + + + + void DataObjectListImpl::checkFactory(DataObjectPtr dob) + { + + DataObjectImpl* d = (DataObjectImpl*)(DataObject*)dob; + + if (d->getDataFactory() == theFactory) return; + + // temporary experiment with allowing data objects + // to move from factory to factory if the type is + // nominally present, and the type systems match + + DataFactoryImpl* f = (DataFactoryImpl*)theFactory; + + + if (d->getContainer() != 0) + { + std::string msg("Insertion of object into list from another factory is only allowed if the parent is null: "); + + const Type& t = d->getType(); + msg += t.getURI(); + msg += "#"; + msg += t.getName(); + msg += " into property "; + msg += container->getProperty(pindex).getName(); + msg += " of type "; + msg += typeURI; + msg += "#"; + msg += typeName; + SDO_THROW_EXCEPTION("checkFactory", SDOInvalidConversionException, + msg.c_str()); + } + + if (f->isCompatible(d->getDataFactory(),d)) + { + d->setDataFactory(theFactory); + // we will also need to transfer any children - assuming they + // are ok in the new factory!! + d->transferChildren(d,theFactory); + return; + } + + std::string msg("Insertion into list from incompatible factory:"); + + const Type& t = d->getType(); + msg += t.getURI(); + msg += "#"; + msg += t.getName(); + msg += " into property "; + msg += container->getProperty(pindex).getName(); + msg += " of type "; + msg += typeURI; + msg += "#"; + msg += typeName; + SDO_THROW_EXCEPTION("checkFactory", SDOInvalidConversionException, + msg.c_str()); + + } + + +void DataObjectListImpl::checkType(const Type& listType, const Type& objectType) + { + if (listType.equals(objectType)) return; + + const TypeImpl* ti = ((DataFactoryImpl*)theFactory)->findTypeImpl + (objectType.getURI(),objectType.getName()); + if (ti != 0) + { + do + { + ti = (const TypeImpl*)ti->getBaseType(); + if (ti == 0) break; + if (listType.equals(*ti)) return; + } while (ti != 0); + + // allow types of any substitutes + if (container != 0) + { + PropertyImpl* pi = + container->getPropertyImpl(pindex); + if (pi != 0) + { + unsigned int subcount = pi->getSubstitutionCount(); + for (int i=0;i<subcount;i++) + { + const Type* tsub = pi->getSubstitutionType(i); + if (tsub != 0 && tsub->equals(objectType)) return; + } + } + } + } + + // no match.. + std::string msg("Insertion of object of incompatible type "); + msg += objectType.getURI(); + msg += "#"; + msg += objectType.getName(); + msg += " into list of type "; + msg += listType.getURI(); + msg += "#"; + msg += listType.getName(); + SDO_THROW_EXCEPTION("TypeCheck", SDOInvalidConversionException, + msg.c_str()); + } + +//TODO Modify parameters to SDOString +void DataObjectListImpl::setType(const char* uri, const char* name) +{ + // need to check for an opentype list which has not been set up yet + if (name == 0) return; + + const TypeImpl* t = ((DataFactoryImpl*)theFactory)->findTypeImpl(uri,name); + if (t == 0) return; // cannot set to a type which is not avilable + + // need to modify the instance property of the container + container->setInstancePropertyType(pindex,t); + + delete typeName; + typeName = new char[strlen(name)+1]; + strcpy(typeName, name); + delete typeURI; + if (uri == 0) + { + typeURI = new char[1]; + typeURI[0] = 0; + } + else + { + typeURI = new char[strlen(uri)+1]; + strcpy(typeURI, uri); + } + typeUnset = false; +} + +void DataObjectListImpl::setType(const SDOString& uri, const SDOString& name) +{ + // need to check for an opentype list which has not been set up yet + // if (name == 0) return; + + const TypeImpl* t = ((DataFactoryImpl*)theFactory)->findTypeImpl(uri.c_str(), name.c_str()); + if (t == 0) return; // cannot set to a type which is not avilable + + // need to modify the instance property of the container + container->setInstancePropertyType(pindex,t); + + delete typeName; + typeName = new char[name.length() + 1]; + strcpy(typeName, name.c_str()); + + delete typeURI; + typeURI = new char[uri.length() + 1]; + strcpy(typeURI, uri.c_str()); + + typeUnset = false; +} + +void DataObjectListImpl::append (DataObjectPtr d) +{ + + if (typeUnset)setType(d->getType().getURI(),d->getType().getName()); + + if (container != 0) + { + container->logChange(pindex); + } + + for (int i=0;i < plist.size(); i++) + { + if (plist[i] == d) + { + std::string msg("Append of object which already exists in the list:"); + msg += typeURI; + msg += " "; + msg += typeName; + SDO_THROW_EXCEPTION("List append", SDOUnsupportedOperationException, + msg.c_str()); + } + } + + checkFactory(d); + + checkType(theFactory->getType(typeURI,typeName), + d->getType()); + + DataObject* dob = d; // unwrap the data object ready for a downcasting hack. + DataObjectImpl* con = ((DataObjectImpl*)dob)->getContainerImpl(); + + if (!isReference) + { + if (con != 0) + { + if (con != container) + { + /* this data object is already contained somewhere else */ + std::string msg("Append of object to list, object is already contained:"); + msg += d->getType().getURI(); + msg += " "; + msg += d->getType().getName(); + SDO_THROW_EXCEPTION("List append", SDOInvalidConversionException, + msg.c_str()); + } + } + else + { + ((DataObjectImpl*)dob)->setContainer(container); + ((DataObjectImpl*)dob)->setApplicableChangeSummary(); + if (!container->getProperty(pindex).getType().isDataType()) + { + ((DataObjectImpl*)dob)->logCreation((DataObjectImpl*)dob, + container,container->getProperty(pindex)); + } + + } + } + plist.insert(plist.end(),RefCountingPointer<DataObjectImpl>((DataObjectImpl*)dob)); + + if (container != 0) { + if (container->getType().isSequencedType()) + { + SequenceImpl* sq = container->getSequenceImpl(); + if (sq)sq->push(container->getProperty(pindex),plist.size()-1); + } + } +} + +void DataObjectListImpl::insert (unsigned int index, bool d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, BooleanLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setBoolean(d); + insert(index, dol); +} + +void DataObjectListImpl::append (bool d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, BooleanLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setBoolean(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, char d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, ByteLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setByte(d); + insert(index, dol); +} + +void DataObjectListImpl::append (char d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, ByteLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setByte(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, wchar_t d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, CharacterLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setCharacter(d); + insert(index, dol); +} + +void DataObjectListImpl::append (wchar_t d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, CharacterLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setCharacter(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, const wchar_t* d, unsigned int length) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, StringLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setString(d, length); + insert(index, dol); +} + +void DataObjectListImpl::append (const wchar_t* d, unsigned int length) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, StringLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setString(d, length); + append( dol); +} +void DataObjectListImpl::insert (unsigned int index, const char* d, unsigned int length) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, BytesLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setBytes(d, length); + insert(index, dol); +} + +void DataObjectListImpl::append (const char* d, unsigned int length) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, BytesLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setBytes(d, length); + append( dol); +} +void DataObjectListImpl::insert (unsigned int index, const char* d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, BytesLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setCString(d); + insert(index, dol); +} + +void DataObjectListImpl::append (const char* d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, BytesLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setCString(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, short d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, ShortLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setShort(d); + insert(index, dol); +} + +void DataObjectListImpl::append (short d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, ShortLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setShort(d); + append( dol); +} + + +#if __WORDSIZE !=64 +void DataObjectListImpl::insert (unsigned int index, long d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, IntegerLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setInteger(d); + insert(index, dol); +} + +void DataObjectListImpl::append (long d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, IntegerLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setInteger(d); + append( dol); +} +#endif + +void DataObjectListImpl::insert (unsigned int index, const SDODate d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, DateLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setDate(d); + insert(index, dol); +} + +void DataObjectListImpl::append (const SDODate d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, DateLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setDate(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, int64_t d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, LongLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setLong(d); + insert(index, dol); +} + +void DataObjectListImpl::append (int64_t d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, LongLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setLong(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, float d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, FloatLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setFloat(d); + insert(index, dol); +} + +void DataObjectListImpl::append (float d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, FloatLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setFloat(d); + append( dol); +} + +void DataObjectListImpl::insert (unsigned int index, long double d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, DoubleLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setDouble(d); + insert(index, dol); +} + +void DataObjectListImpl::append (long double d) +{ + if (theFactory == 0) return; + + if (typeUnset)setType(Type::SDOTypeNamespaceURI, DoubleLiteral); + + RefCountingPointer<DataObject> dol = theFactory->create(typeURI, typeName); + DataObject* dob = dol; + ((DataObjectImpl*)dob)->setDouble(d); + append( dol); +} + + +void DataObjectListImpl::decrementPindex() +{ + pindex--; +} + + +RefCountingPointer<DataObject> DataObjectListImpl::remove(unsigned int index) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> d = (*this)[index]; + + // log deletion only if the list is of data objects. + if (theFactory != 0) + { + const Type& t = theFactory->getType(typeURI,typeName); + const Property& p = container->getProperty(pindex); + if (!t.isDataType() && !p.isReference()) + { + (getVec()[index])->logDeletion(); + } + } + plist.erase(plist.begin()+index); + DataObject* dob = d; + ((DataObjectImpl*)dob)->setContainer(0); + return d; +} + +void DataObjectListImpl::validateIndex(int index) const +{ + if ((index < 0) || (index >= size())) + { + char val[32]; + std::string msg("Index out of range:"); + sprintf(val,"%d",index); + msg += val; + SDO_THROW_EXCEPTION("validateIndex", SDOIndexOutOfRangeException, + msg.c_str()); + + } + +} + +bool DataObjectListImpl::getBoolean(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getBoolean(); +} +char DataObjectListImpl::getByte(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getByte(); +} +wchar_t DataObjectListImpl::getCharacter(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getCharacter(); +} +unsigned int DataObjectListImpl::getBytes(unsigned int index, char* value, unsigned int max) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getBytes(value, max); +} +unsigned int DataObjectListImpl::getString(unsigned int index, wchar_t* value, unsigned int max) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getString(value, max); +} +short DataObjectListImpl::getShort(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getShort(); +} +long DataObjectListImpl::getInteger(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getInteger(); +} +int64_t DataObjectListImpl::getLong(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getLong(); +} +float DataObjectListImpl::getFloat(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getFloat(); +} +long double DataObjectListImpl::getDouble(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getDouble(); +} +const SDODate DataObjectListImpl::getDate(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getDate(); +} +const char* DataObjectListImpl::getCString(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> d = ((*this)[index]); + DataObject* dob = d; + return ((DataObjectImpl*)dob)->getCString(); +} + +DataObjectPtr DataObjectListImpl::getDataObject(unsigned int index) const +{ + validateIndex(index); + return (*this)[index]; +} + +void DataObjectListImpl::setBoolean(unsigned int index, bool d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setBoolean(d); +} +void DataObjectListImpl::setByte(unsigned int index, char d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setByte(d); +} +void DataObjectListImpl::setCharacter(unsigned int index, wchar_t d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setCharacter(d); +} + +void DataObjectListImpl::setString(unsigned int index, const wchar_t* d, unsigned int len) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setString(d, len); +} +void DataObjectListImpl::setBytes(unsigned int index, const char* d, unsigned int len) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setBytes(d, len); +} + +void DataObjectListImpl::setShort(unsigned int index, short d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setShort(d); +} +void DataObjectListImpl::setInteger(unsigned int index, long d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setInteger(d); +} +void DataObjectListImpl::setLong(unsigned int index, int64_t d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setLong(d); +} +void DataObjectListImpl::setFloat(unsigned int index, float d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setFloat(d); +} +void DataObjectListImpl::setDouble(unsigned int index, long double d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setDouble(d); +} +void DataObjectListImpl::setDate(unsigned int index, const SDODate d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setDate(d); +} +void DataObjectListImpl::setCString(unsigned int index, char* d) +{ + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + ((DataObjectImpl*)dob)->setCString(d); +} + +void DataObjectListImpl::setDataObject(unsigned int index, DataObjectPtr dob) +{ + + if (dob != 0) + { + checkFactory(dob); + + checkType(theFactory->getType(typeURI,typeName), + dob->getType()); + } + + validateIndex(index); + if (container != 0) + { + container->logChange(pindex); + } + + remove(index); + insert(index,dob); +} + +unsigned int DataObjectListImpl::getLength(unsigned int index) const +{ + validateIndex(index); + RefCountingPointer<DataObject> dd = ((*this)[index]); + DataObject* dob = dd; + return dob->getLength(); +} + + const SDOString DataObjectListImpl::BooleanLiteral = "Boolean"; + const SDOString DataObjectListImpl::ByteLiteral = "Byte"; + const SDOString DataObjectListImpl::CharacterLiteral = "Character"; + const SDOString DataObjectListImpl::BytesLiteral = "Bytes"; + const SDOString DataObjectListImpl::StringLiteral = "String"; + const SDOString DataObjectListImpl::IntegerLiteral = "Integer"; + const SDOString DataObjectListImpl::ShortLiteral = "Short"; + const SDOString DataObjectListImpl::DateLiteral = "Date"; + const SDOString DataObjectListImpl::LongLiteral = "Long"; + const SDOString DataObjectListImpl::FloatLiteral = "Float"; + const SDOString DataObjectListImpl::DoubleLiteral = "Double"; + +}; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectListImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectListImpl.h new file mode 100644 index 0000000000..78af3a0ea5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DataObjectListImpl.h @@ -0,0 +1,207 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/06 12:58:18 $ */ + +#ifndef _DATAOBJECTLISTIMPL_H_ +#define _DATAOBJECTLISTIMPL_H_ + +#include "commonj/sdo/DataObjectList.h" +#include "commonj/sdo/SDODate.h" + +#include "commonj/sdo/disable_warn.h" + +#include <vector> + + +namespace commonj{ +namespace sdo{ + +class DataObjectImpl; +class DataFactory; + +typedef std::vector< RefCountingPointer<DataObjectImpl> > DATAOBJECT_VECTOR; + +/** + * DataObjectListImpl implements the abstract class DataObjectList. + * List for retrieving many valued property values. + * + * DataObjectList provides an API for getting and setting values in + * many valued properties. The list deals with both DataType and + * DataObjectType properties. + */ + +class DataObjectListImpl : public DataObjectList +{ + +public: + DataObjectListImpl(DATAOBJECT_VECTOR p); + DataObjectListImpl(const DataObjectListImpl &pin); + DataObjectListImpl(); + DataObjectListImpl(DataFactory* df, DataObjectImpl* cont, unsigned int inpindex, + const char* tURI, const char* tName); + + virtual ~DataObjectListImpl(); + + // open type support + virtual void decrementPindex(); + + virtual DataObjectPtr operator[] (int pos); + virtual const DataObjectPtr operator[] (int pos) const; + + // set/get primitive values + virtual bool getBoolean(unsigned int index) const; + virtual char getByte(unsigned int index) const; + virtual wchar_t getCharacter(unsigned int index) const; + virtual unsigned int getString(unsigned int index, wchar_t* buf, + unsigned int max) const; + virtual unsigned int getBytes(unsigned int index, char* buf, + unsigned int max) const; + virtual short getShort(unsigned int index) const; + virtual long getInteger(unsigned int index) const; + virtual int64_t getLong(unsigned int index) const; + virtual float getFloat(unsigned int index) const; + virtual long double getDouble(unsigned int index) const; + virtual const SDODate getDate(unsigned int index) const; + virtual const char* getCString(unsigned int index) const; + virtual DataObjectPtr getDataObject(unsigned int index) const; + + virtual void setBoolean(unsigned int index, bool d); + virtual void setByte(unsigned int index, char d); + virtual void setCharacter(unsigned int index, wchar_t d); + virtual void setString(unsigned int index, const wchar_t* d, unsigned int len); + virtual void setBytes(unsigned int index, const char* d, unsigned int len); + virtual void setShort(unsigned int index, short d); + virtual void setInteger(unsigned int index, long d); + virtual void setLong(unsigned int index, int64_t d); + virtual void setFloat(unsigned int index, float d); + virtual void setDouble(unsigned int index, long double d); + virtual void setDate(unsigned int index, const SDODate d); + virtual void setCString(unsigned int index, char* d); + virtual void setDataObject(unsigned int index, DataObjectPtr dob); + + virtual unsigned int getLength(unsigned int index) const; + + virtual int size () const; + + virtual void insert (unsigned int index, DataObjectPtr d); + virtual void append (DataObjectPtr d); + + virtual void insert (unsigned int index, bool d) ; + virtual void append (bool d) ; + + virtual void insert (unsigned int index, char d) ; + virtual void append (char d) ; + + virtual void insert (unsigned int index, wchar_t d) ; + virtual void append (wchar_t d) ; + + virtual void insert (unsigned int index, const wchar_t* d, unsigned int len) ; + virtual void append (const wchar_t* d, unsigned int len) ; + + virtual void insert (unsigned int index, const char* d, unsigned int len) ; + virtual void append (const char* d, unsigned int len) ; + + virtual void insert (unsigned int index, const char* d) ; + virtual void append (const char* d) ; + + virtual void insert (unsigned int index, short d) ; + virtual void append (short d) ; + + virtual void insert (unsigned int index, const SDODate d) ; + virtual void append (const SDODate d) ; + +#if __WORDSIZE !=64 + virtual void insert (unsigned int index, long d) ; + virtual void append (long d) ; +#endif + + virtual void insert (unsigned int index, int64_t d) ; + virtual void append (int64_t d) ; + + virtual void insert (unsigned int index, float d) ; + virtual void append (float d) ; + + virtual void insert (unsigned int index, long double d) ; + virtual void append (long double d) ; + + + virtual DataObjectPtr remove (unsigned int index); + + virtual void checkFactory(DataObjectPtr dob); + virtual void checkType(const Type& listType, const Type& objectType); + virtual void setType(const char* uri, const char* name); + virtual void setType(const SDOString& uri, const SDOString& name); + + /* getType returns type + * + * Returns the type. + * May throw SDOTYpeNotFoundException for unset open types + */ + + + virtual const Type& getType(); + + /* getTypeEnum returns an enumerator for the type + * + * Returns an enumerator for the type for easy switching on basic types. + * The enumerator is part of the Type class + * May throw SDOTypeNotFoundException for open types + */ + + virtual const Type::Types getTypeEnum(); + + +private: + DATAOBJECT_VECTOR plist; + DATAOBJECT_VECTOR getVec() const; + + // For creation of items via the insert/append api. + char* typeURI; + char* typeName; + + // for open types, the list may not have a type until the + // first item is entered + + bool typeUnset; + + // No reference count held on the factory + DataFactory* theFactory; + + // For logging a change in the change summary when appending + DataObjectImpl* container; + unsigned int pindex; + bool isReference; + + void validateIndex(int index) const; + + static const SDOString BooleanLiteral; + static const SDOString ByteLiteral; + static const SDOString CharacterLiteral; + static const SDOString BytesLiteral; + static const SDOString StringLiteral; + static const SDOString IntegerLiteral; + static const SDOString ShortLiteral; + static const SDOString DateLiteral; + static const SDOString LongLiteral; + static const SDOString FloatLiteral; + static const SDOString DoubleLiteral; + +}; +}; +}; +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DefaultLogWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DefaultLogWriter.cpp new file mode 100644 index 0000000000..bfd75a18fb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DefaultLogWriter.cpp @@ -0,0 +1,53 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/disable_warn.h" +#include "commonj/sdo/DefaultLogWriter.h" + +#include <iostream> +using namespace std; + +namespace commonj +{ + namespace sdo + { + + DefaultLogWriter::DefaultLogWriter() + { + formatindent = 0; + } + + DefaultLogWriter::~DefaultLogWriter() + { + } + + void DefaultLogWriter::log(int indent, int level, const char* msg) + { + if (indent < 0) formatindent += indent; + for (int i=0; i < formatindent; i++) + { + cout << " "; + } + cout << msg <<endl; + if (indent > 0) formatindent += indent; + } + + } // End namespace sca +} // End namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DefaultLogWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DefaultLogWriter.h new file mode 100644 index 0000000000..e9b5318c4e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/DefaultLogWriter.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef SDO_DefaultLOGWriter_H +#define SDO_DefaultLOGWriter_H + +#include "commonj/sdo/LogWriter.h" + + + +namespace commonj +{ + namespace sdo + { + +/** + * DefaultLogWriter is a basic log writer, part of the logger. + * The logging API holds a log writer , and uses it to send + * output whereever it is needed. The application writer would + * hook their own LogWriter in place of this simple one. + */ + class DefaultLogWriter : public LogWriter + { + public: + + DefaultLogWriter(); + virtual ~DefaultLogWriter(); + + virtual void log(int indent, int level, const char* msg); + private: + int formatindent; + }; + + } // End namespace sca +} // End namespace commonj +#endif // SDO_DefaultLOGWriter_H diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/EqualityHelper.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/EqualityHelper.cpp new file mode 100644 index 0000000000..603c24891e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/EqualityHelper.cpp @@ -0,0 +1,370 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" +#include "commonj/sdo/Sequence.h" + +#include "commonj/sdo/DataObject.h" + + + +#include "commonj/sdo/EqualityHelper.h" + +namespace commonj{ +namespace sdo{ + + bool EqualityHelper::compareitem(DataObjectPtr to, DataObjectPtr from, const Property& p) + { + switch (p.getTypeEnum()) + { + case Type::BooleanType: + return (to->getBoolean(p) == from->getBoolean(p)); + case Type::ByteType: + return (to->getByte(p) == from->getByte(p)); + case Type::CharacterType: + return (to->getCharacter(p) == from->getCharacter(p)); + case Type::IntegerType: + return (to->getInteger(p) == from->getInteger(p)); + case Type::ShortType: + return (to->getShort(p) == from->getShort(p)); + case Type::DoubleType: + return (to->getDouble(p) == from->getDouble(p)); + case Type::FloatType: + return (to->getFloat(p) == from->getFloat(p)); + case Type::LongType: + return (to->getLong(p) == from->getLong(p)); + case Type::DateType: + return (to->getDate(p).getTime() == from->getDate(p).getTime()); + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + unsigned int siz = from->getLength(p); + if (siz != to->getLength(p)) return false; + + if (siz > 0) + { + wchar_t * buff = new wchar_t[siz]; + wchar_t * buft = new wchar_t[siz]; + from->getString(p, buff, siz); + to->getString(p, buft, siz); + for (int i=0;i< siz; i++) + { + if (buff[i] != buft[i]) + { + delete buff; + delete buft; + return false; + } + } + delete buff; + delete buft; + } + return true; + } + case Type::BytesType: + { + unsigned int siz = from->getLength(p); + if (siz != to->getLength(p)) return false; + + if (siz > 0) + { + char * buff = new char[siz]; + char * buft = new char[siz]; + from->getBytes(p, buff, siz); + to->getBytes(p, buft, siz); + for (int i=0;i< siz; i++) + { + if (buff[i] != buft[i]) + { + delete buff; + delete buft; + return false; + } + } + delete buff; + delete buft; + } + return true; + } + default: + return true; + } // switch + } + + bool EqualityHelper::comparelist(DataObjectList& to, DataObjectList& from, Type::Types t) + { + switch (t) + { + case Type::BooleanType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getBoolean(i) != from.getBoolean(i)) + { + return false; + } + } + return true; + } + + case Type::ByteType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getByte(i) != from.getByte(i)) + { + return false; + } + } + return true; + } + + case Type::CharacterType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getCharacter(i) != from.getCharacter(i)) + { + return false; + } + } + return true; + } + + case Type::IntegerType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getInteger(i) != from.getInteger(i)) + { + return false; + } + } + return true; + } + + case Type::ShortType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getShort(i) != from.getShort(i)) + { + return false; + } + } + return true; + } + case Type::DoubleType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getDouble(i) != from.getDouble(i)) + { + return false; + } + } + return true; + } + + case Type::FloatType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getFloat(i) != from.getFloat(i)) + { + return false; + } + } + return true; + } + + case Type::LongType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getLong(i) != from.getLong(i)) + { + return false; + } + } + return true; + } + + case Type::DateType: + { + for (int i=0;i< from.size(); i++) + { + if (to.getDate(i).getTime() != from.getDate(i).getTime()) + { + return false; + } + } + return true; + } + + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + for (int i=0;i< from.size(); i++) + { + unsigned int siz = from.getLength(i); + if (siz != to.getLength(i)) return false; + + if (siz > 0) + { + wchar_t * buff = new wchar_t[siz]; + wchar_t * buft = new wchar_t[siz]; + from.getString(i,buff,siz); + to.getString(i,buft,siz); + for (int j=0;j<siz;j++) + { + if (buff[j] != buft[j]) + { + delete buff; + delete buft; + return false; + } + } + delete buff; + delete buft; + } + } + return true; + } + + case Type::BytesType: + { + for (int i=0;i< from.size(); i++) + { + unsigned int siz = from.getLength(i); + if (siz != to.getLength(i)) return false; + + if (siz > 0) + { + char * buff = new char[siz]; + char * buft = new char[siz]; + from.getBytes(i,buff,siz); + to.getBytes(i,buft,siz); + for (int j=0;j<siz;j++) + { + if (buff[j] != buft[j]) + { + delete buff; + delete buft; + return false; + } + } + delete buff; + delete buft; + } + } + return true; + } + + default: + return true; + + } // case + } // method + + bool EqualityHelper::equalShallow(DataObjectPtr dataObject1, DataObjectPtr dataObject2) + { + return internalEqual(dataObject1, dataObject2, false); + + } + + bool EqualityHelper::equal(DataObjectPtr dataObject1, DataObjectPtr dataObject2) + { + return internalEqual(dataObject1, dataObject2, true); + } + + + bool EqualityHelper::internalEqual(DataObjectPtr dataObject1, + DataObjectPtr dataObject2, + bool fullEqual) + { + + + PropertyList pl = dataObject1->getInstanceProperties(); + for (int i=0;i < pl.size(); i++) + { + // data objects are only compared the deep equality case + if (pl[i].getType().isDataObjectType()) + { + if (!fullEqual) + { + continue; + } + else + { + if (pl[i].isMany()) + { + DataObjectList& dolold = dataObject1->getList(pl[i]); + DataObjectList& dolnew = dataObject2->getList(pl[i]); + if (dolnew.size() != dolold.size()) return false; + + for (int i=0;i< dolold.size(); i++) + { + if (!internalEqual(dolold[i], dolnew[i], true)) + { + return false; + } + } + } + else + { + if (!internalEqual( + dataObject1->getDataObject(pl[i]), + dataObject2->getDataObject(pl[i]), true)) + { + return false; + } + } + } + } + else + { + if (pl[i].isMany()) + { + DataObjectList& dolold = dataObject1->getList(pl[i]); + DataObjectList& dolnew = dataObject2->getList(pl[i]); + if (dolold.size() != dolnew.size()) return false; + if (!comparelist(dolold, dolnew, pl[i].getTypeEnum())) return false; + } + else + { + if (!compareitem(dataObject1,dataObject2, pl[i])) + { + return false; + } + } // else + } + } + return true; + } + +} +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/EqualityHelper.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/EqualityHelper.h new file mode 100644 index 0000000000..381564338c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/EqualityHelper.h @@ -0,0 +1,97 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _EQUALITYHELPER_H_ +#define _EQUALITYHELPER_H_ + +#include "commonj/sdo/RefCountingPointer.h" + + + +namespace commonj{ +namespace sdo{ + +/** + * EqualityHelper provides static helper methods for equals. + * equalsShallow compares the DataType properties of the + * two data objects. + * equals performs a check on all the memebers and verifies that + * the same data objects are children. + */ + + class EqualityHelper +{ + public: + + /** + * Shallow compare of DataObjects + * + * Compares two DataObjects for each property where + * property.getType().isDataObjectType() is false. + * Compares dataObject1.get(property).equals(dataObject2.get(property)) + * Properties where property.getType().isDataObjectType() is true + * are not compared. + * DataObjects must have the same type + * dataObject1.getType() == dataObject2.getType() + * Returns true if all values of all compared properties are equal. + * @param dataObject1 DataObject to be compared + * @param dataObject2 DataObject to be compared + * @return true if equal + */ + static SDO_API bool equalShallow(DataObjectPtr dataObject1, DataObjectPtr dataObject2); + + /** + * Deep compare of DataObjects + * Compares dataObject1 and dataObject2 and all their contained + * DataObjects (property.isContainment() is true) recursively. + * Values of properties are comapred as in isEqualShallow, + * and values of properties where + * property.getType().isDataObjectType() is true + * are compared where each value copied must be a corresponding + * DataObject contained by the source dataObject. + * The dataObject trees must be closed. + * If any DataObject referenced in either tree is not part of the + * containment trees an IllegalArgumentException is thrown. + * If a ChangeSummary is part of the tree they must contain an + * identical summary for their respective trees. + * + * @param dataObject1 DataObject to be compared + * @param dataObject2 DataObject to be compared + * @return true if all compared aspects of all compared objects are equal + * @throws IllegalArgumentException if any referenced DataObject + * is not part of the containment trees. + */ + static SDO_API bool equal(DataObjectPtr dataObject1, DataObjectPtr dataObject2); + + private: + + static bool internalEqual(DataObjectPtr dataObject1, + DataObjectPtr dataObject2, + bool fullEqual); + + static bool comparelist(DataObjectList& to, DataObjectList& from, Type::Types t); + + static bool compareitem(DataObjectPtr to, DataObjectPtr from, const Property& p); + + + +}; +}; +}; +#endif //_EQUALITYHELPER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupDefinition.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupDefinition.cpp new file mode 100644 index 0000000000..57870a7516 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupDefinition.cpp @@ -0,0 +1,34 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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/GroupDefinition.h" +namespace commonj +{ + namespace sdo + { + GroupDefinition::GroupDefinition() + { + } + + GroupDefinition::~GroupDefinition() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupDefinition.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupDefinition.h new file mode 100644 index 0000000000..685c1119e8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupDefinition.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#ifndef _GROUPDEFINITION_H_ +#define _GROUPDEFINITION_H_ + +#include "commonj/sdo/disable_warn.h" +#include "commonj/sdo/GroupEvent.h" + +#include "list" + + +namespace commonj +{ + namespace sdo + { + + +/** + * TypeDefinition holds information gathered from parsing the + * XSD and used for creating Types + */ + class GroupDefinition + { + + public: + GroupDefinition(); + virtual ~GroupDefinition(); + + + SDOXMLString name; + SDOXMLString uri; + bool isAttributeGroup; + std::vector<GroupEvent> events; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_TYPEDEFINITION_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupEvent.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupEvent.cpp new file mode 100644 index 0000000000..adad37ff82 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupEvent.cpp @@ -0,0 +1,62 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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/GroupEvent.h" +namespace commonj +{ + namespace sdo + { + GroupEvent::GroupEvent() + { + } + + GroupEvent::GroupEvent( + const SDOXMLString& inlocalname, + const SDOXMLString& inprefix, + const SDOXMLString& inURI, + const SAX2Namespaces& innamespaces, + const SAX2Attributes& inattributes + ) + { + localname = inlocalname; + prefix = inprefix; + URI = inURI; + namespaces = innamespaces; + attributes = inattributes; + isStartEvent = true; + } + + GroupEvent::GroupEvent( + const SDOXMLString& inlocalname, + const SDOXMLString& inprefix, + const SDOXMLString& inURI + ) + { + localname = inlocalname; + prefix = inprefix; + URI = inURI; + isStartEvent = false; + } + + GroupEvent::~GroupEvent() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupEvent.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupEvent.h new file mode 100644 index 0000000000..a2ae966398 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/GroupEvent.h @@ -0,0 +1,68 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#ifndef _GROUPEVENT_H_ +#define _GROUPEVENT_H_ + +#include "commonj/sdo/disable_warn.h" + + +#include "commonj/sdo/SAX2Parser.h" + +namespace commonj +{ + namespace sdo + { + + + class GroupEvent + { + + public: + GroupEvent(); + GroupEvent( + const SDOXMLString& inlocalname, + const SDOXMLString& inprefix, + const SDOXMLString& inURI, + const SAX2Namespaces& innamespaces, + const SAX2Attributes& inattributes + ); + + GroupEvent( + const SDOXMLString& inlocalname, + const SDOXMLString& inprefix, + const SDOXMLString& inURI + ); + + virtual ~GroupEvent(); + + bool isStartEvent; + SDOXMLString localname; + SDOXMLString prefix; + SDOXMLString URI; + SAX2Namespaces namespaces; + SAX2Attributes attributes; + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_TYPEDEFINITION_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/HelperProvider.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/HelperProvider.cpp new file mode 100644 index 0000000000..b41c47a501 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/HelperProvider.cpp @@ -0,0 +1,47 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/HelperProvider.h" +#include "commonj/sdo/XSDHelperImpl.h" +#include "commonj/sdo/XMLHelperImpl.h" +#include "commonj/sdo/export.h" +#include "commonj/sdo/DataFactory.h" + +namespace commonj +{ + namespace sdo + { + + ////////////////////////////////////////////////////////////////////// + // Create an XSDHelper + ////////////////////////////////////////////////////////////////////// + XSDHelperPtr HelperProvider::getXSDHelper(DataFactoryPtr dataFactory) + { + return new XSDHelperImpl(dataFactory); + } + ////////////////////////////////////////////////////////////////////// + // Create an XMLHelper + ////////////////////////////////////////////////////////////////////// + XMLHelperPtr HelperProvider::getXMLHelper(DataFactoryPtr dataFactory) + { + return new XMLHelperImpl(dataFactory); + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/HelperProvider.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/HelperProvider.h new file mode 100644 index 0000000000..7be271f128 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/HelperProvider.h @@ -0,0 +1,65 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _HELPERPROVIDER_H_ +#define _HELPERPROVIDER_H_ + + +#include "commonj/sdo/XSDHelper.h" +#include "commonj/sdo/XMLHelper.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/export.h" + + +namespace commonj +{ + namespace sdo + { + + +/** + * HelperProvider gives access to helpers (static methods). + * + * The helper provider gives back an XSD or XML helper associated + * with the given data factory + */ + class HelperProvider + { + public: + +/** + * + * The helper provider gives back an XSD helper associated + * with the given data factory + */ + SDO_API static XSDHelperPtr getXSDHelper(DataFactoryPtr dataFactory=0); + +/** + * + * The helper provider gives back an XML helper associated + * with the given data factory + */ + SDO_API static XMLHelperPtr getXMLHelper(DataFactoryPtr dataFactory=0); + + }; + + } // End - namespace sdo +} // End - namespace commonj + +#endif // _HELPERPROVIDER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/LogWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/LogWriter.cpp new file mode 100644 index 0000000000..79f7d48671 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/LogWriter.cpp @@ -0,0 +1,32 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/LogWriter.h" + +namespace commonj +{ + namespace sdo + { + LogWriter::~LogWriter() + { + } + + } // End namespace sdo +} // End namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/LogWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/LogWriter.h new file mode 100644 index 0000000000..9948c86ed9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/LogWriter.h @@ -0,0 +1,44 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef SDO_LOGWriter_H +#define SDO_LOGWriter_H + +#include "commonj/sdo/export.h" + +namespace commonj +{ + namespace sdo + { + +/** + * LogWriter is an abstract class for implementers to inherit from. + * see DefaultLogWriter. + */ + class LogWriter + { + public: + virtual ~LogWriter(); + + SDO_API virtual void log(int indent, int level, const char* msg) = 0; + }; + + } // End namespace sdo +} // End namespace commonj +#endif // SDO_LOGWriter_H diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logger.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logger.cpp new file mode 100644 index 0000000000..6d799f2435 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logger.cpp @@ -0,0 +1,100 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/01/23 16:39:24 $ */ + +#include "commonj/sdo/Logger.h" +#include <iostream> +#include <stdarg.h> +#include "commonj/sdo/DefaultLogWriter.h" +#include <stdio.h> + +using namespace std; + +namespace commonj +{ + namespace sdo + { + LogWriter* Logger::logWriter = getLogWriter(); + + LogWriter* Logger::getLogWriter() + { + if (logWriter == 0) + { + setLogWriter(0); + } + return logWriter; + } + + void Logger::setLogWriter(LogWriter* writer) + { + if (logWriter != writer) + { + delete logWriter; + } + + if (writer == 0) + { + logWriter = new DefaultLogWriter; + } + else + { + logWriter = writer; + } + } + + int Logger::loggingLevel = setLogging(); + + int Logger::setLogging() + { + char* loggingVar = 0; + loggingVar = getenv("SDO4CPP_LOGGING"); + if (loggingVar == 0) + return 0; + else + return atoi(loggingVar); + } + + void Logger::setLogging(int level) + { + loggingLevel = level; + } + + void Logger::log(int indent, int level, const char* msg) + { + if (level <= loggingLevel) + { + logWriter->log(indent, level, msg); + } + } + + void Logger::logArgs(int indent, int level, const char* msg, ...) + { + if (level <= loggingLevel) + { + va_list variableArguments; + va_start(variableArguments, msg); + char messageBuffer[1024]; + vsprintf(messageBuffer, msg, variableArguments); + logWriter->log(indent, level, messageBuffer); + va_end(variableArguments); + } + } + + } // End namespace sdo +} // End namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logger.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logger.h new file mode 100644 index 0000000000..ee566e9c44 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logger.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef SDO_LOGGER_H +#define SDO_LOGGER_H + + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/LogWriter.h" +namespace commonj +{ + namespace sdo + { + +/** + * Logger is used for debug style logging such as method trace. + * The logger can log at different levels, and can log entry, exit + * and events. The log entries can take arguments or be just + * strings. + */ + class Logger { + + public: +/** + * attach a log writer. + */ + SDO_API static void setLogWriter(LogWriter* writer); +/** + * switch logging to a level. + */ + SDO_API static void setLogging(int level); + +/** + * log a message. + */ + SDO_API static void log(int indent, int level, const char* msg); +/** + * log a message with parameters. + */ + SDO_API static void logArgs(int indent, int level, const char* msg, ...); + + static int loggingLevel; + + private: + static LogWriter* logWriter; + static LogWriter* getLogWriter(); + static int setLogging(); + }; + + } // End namespace sdo +} // End namespace commonj +#endif // SDO_LOGGER_H diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logging.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logging.h new file mode 100644 index 0000000000..e2adac2d84 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Logging.h @@ -0,0 +1,170 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/Logger.h" +#include "commonj/sdo/SDORuntimeException.h" + +# +#ifndef SDO_LOGGING_H +#define SDO_LOGGING_H + +/** + * logging level for stuff you rarely want to see, like + * memory allocations. + */ + +#define HIGHVOLUME 40 +/** + * logging level for normal path information + */ +#define INFO 30 + + /** + * logging level for something which is unusual. + */ + +#define WARNING 20 +/** + * logging level for a major problem + */ + +#define ERROR 10 + +#define INDENT 1 +#define OUTDENT -1 +#define NODENT 0 + + +/** + * Macro for simplifying addition of trace points + */ + +#ifdef _DEBUG +#define LOGENTRY(level, methodName) \ +if (Logger::loggingLevel >= level) \ +Logger::logArgs(INDENT, level, "Entering: %s", methodName); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGEXIT(level, methodName) \ +if (Logger::loggingLevel >= level) \ +Logger::logArgs(OUTDENT, level, "Exiting: %s" ,methodName); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGINFO(level, message) \ +if (Logger::loggingLevel >= level) \ +Logger::log(NODENT, level, message); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGINFO_1(level, message, arg1) \ +if (Logger::loggingLevel >= level) \ +Logger::logArgs(NODENT,level, message, arg1); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGINFO_2(level, message, arg1, arg2) \ +if (Logger::loggingLevel >= level) \ +Logger::logArgs(NODENT,level, message, arg1, arg2); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGERROR(level, message) \ +if (Logger::loggingLevel >= level) \ +Logger::log(NODENT,level, message); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGERROR_1(level, message, arg1) \ +if (Logger::loggingLevel >= level) \ +Logger::logArgs(NODENT,level, message, arg1); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGERROR_2(level, message, arg1, arg2) \ +if (Logger::loggingLevel >= level) \ +Logger::logArgs(NODENT,level, message, arg1, arg2); + +/** + * Macro for simplifying addition of trace points + */ +#define LOGSDOEXCEPTION(level, message, arg1) \ +if (Logger::loggingLevel >= level) \ +Logger::log(NODENT,level, message);\ +Logger::logArgs(NODENT,level, "%s:%s\nIn %s\nAt %s line %ld\n",\ + ((SDORuntimeException)arg1).getEClassName(),\ + ((SDORuntimeException)arg1).getMessageText(),\ + ((SDORuntimeException)arg1).getFunctionName(),\ + ((SDORuntimeException)arg1).getFileName(),\ + ((SDORuntimeException)arg1).getLineNumber()); + +#else // Not DEBUG + +/** + * Macro for simplifying addition of trace points + */ +#define LOGSDOEXCEPTION(level, message, arg1) + +/** + * Macro for simplifying addition of trace points + */ +#define LOGENTRY(level, methodName) + +/** + * Macro for simplifying addition of trace points + */ +#define LOGEXIT(level, methodName) + +/** + * Macro for simplifying addition of trace points + */ +#define LOGINFO(level, message) + +/** + * Macro for simplifying addition of trace points + */ +#define LOGINFO_1(level, message, arg1) + +/** + * Macro for simplifying addition of trace points + */ +#define LOGINFO_2(level, message, arg1, arg2) +/** + * Macro for simplifying addition of trace points + */ +#define LOGERROR(level, message) +/** + * Macro for simplifying addition of trace points + */ +#define LOGERROR_1(level, message, arg1) +/** + * Macro for simplifying addition of trace points + */ +#define LOGERROR_2(level, message, arg1, arg2) + +#endif +#endif // SDO_LOGGING_H diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Makefile.am new file mode 100644 index 0000000000..7bc7726be7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Makefile.am @@ -0,0 +1,87 @@ +lib_LTLIBRARIES = libtuscany_sdo.la +AM_CPPFLAGS = $(CPPFLAGS) + +libtuscany_sdo_la_SOURCES = \ + ChangedDataObjectListImpl.cpp \ + ChangeSummaryBuilder.cpp \ + ChangeSummary.cpp \ + ChangeSummaryImpl.cpp \ + CopyHelper.cpp \ + DASProperty.cpp \ + DASType.cpp \ + DASValue.cpp \ + DASValues.cpp \ + DataFactory.cpp \ + DataFactoryImpl.cpp \ + DataGraph.cpp \ + DataGraphImpl.cpp \ + DataObject.cpp \ + DataObjectImpl.cpp \ + DataObjectInstance.cpp \ + DataObjectList.cpp \ + DataObjectListImpl.cpp \ + DefaultLogWriter.cpp \ + EqualityHelper.cpp \ + GroupDefinition.cpp \ + GroupEvent.cpp \ + HelperProvider.cpp \ + Logger.cpp \ + LogWriter.cpp \ + ParserErrorSetter.cpp \ + Property.cpp \ + PropertyDefinition.cpp \ + PropertyDefinitionImpl.cpp \ + PropertyImpl.cpp \ + PropertyList.cpp \ + PropertySetting.cpp \ + RefCountingObject.cpp \ + RefCountingPointer.cpp \ + SAX2Attribute.cpp \ + SAX2Attributes.cpp \ + SAX2Namespaces.cpp \ + SAX2Parser.cpp \ + SchemaInfo.cpp \ + SdoCheck.cpp \ + SDODate.cpp \ + SdoRuntime.cpp \ + SDORuntimeException.cpp \ + SDOSAX2Parser.cpp \ + SDOSchemaSAX2Parser.cpp \ + SDOString.cpp \ + SDOUtils.cpp \ + SDOXMLBufferWriter.cpp \ + SDOXMLFileWriter.cpp \ + SDOXMLStreamWriter.cpp \ + SDOXMLString.cpp \ + SDOXMLWriter.cpp \ + SDOXSDBufferWriter.cpp \ + SDOXSDFileWriter.cpp \ + SDOXSDStreamWriter.cpp \ + SDOXSDWriter.cpp \ + Sequence.cpp \ + SequenceImpl.cpp \ + Setting.cpp \ + SettingList.cpp \ + Type.cpp \ + TypeDefinition.cpp \ + TypeDefinitions.cpp \ + TypeDefinitionImpl.cpp \ + TypeDefinitionsImpl.cpp \ + TypeImpl.cpp \ + TypeList.cpp \ + XMLDocument.cpp \ + XMLDocumentImpl.cpp \ + XMLHelper.cpp \ + XMLHelperImpl.cpp \ + XMLQName.cpp \ + XpathHelper.cpp \ + XSDHelper.cpp \ + XSDHelperImpl.cpp \ + XSDPropertyInfo.cpp \ + XSDTypeInfo.cpp + +libtuscany_sdo_la_LIBADD = + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${LIBXML2_INCLUDE} + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ParserErrorSetter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ParserErrorSetter.cpp new file mode 100644 index 0000000000..2d9a99360f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ParserErrorSetter.cpp @@ -0,0 +1,38 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +// ParserErrorSetter.cpp: class allowing parser to push errors back. +// +////////////////////////////////////////////////////////////////////// +#include "commonj/sdo/ParserErrorSetter.h" +namespace commonj +{ + namespace sdo + { + ////////////////////////////////////////////////////////////////////// + // Construction/Destruction + ////////////////////////////////////////////////////////////////////// + ParserErrorSetter::~ParserErrorSetter() + { + } + + } // End - namespace sdo +} // End - namespace commonj + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ParserErrorSetter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ParserErrorSetter.h new file mode 100644 index 0000000000..f4261c1154 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/ParserErrorSetter.h @@ -0,0 +1,48 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#ifndef _PARSER_ERROR_SETTER_H_ +#define _PARSER_ERROR_SETTER_H_ + +#include "commonj/sdo/export.h" + +#include "commonj/sdo/disable_warn.h" + +#include <vector> + +namespace commonj{ +namespace sdo{ + +/** + * The ParserErrorSetter builds a list of all the errors which + * occurred during a parse, so they can be displayed for the + * user of an XSDHelper or XMLHelper + */ + +class ParserErrorSetter +{ +public: + virtual ~ParserErrorSetter(); + virtual void setError(const char* message) = 0; + virtual void clearErrors() = 0; +}; +}; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Property.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Property.cpp new file mode 100644 index 0000000000..11fc167377 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Property.cpp @@ -0,0 +1,42 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include <iostream> +using namespace std; + + +#ifndef SDO_EXPORTS +#define SDO_EXPORTS +#endif +#include "commonj/sdo/export.h" + +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/TypeList.h" + +#include "commonj/sdo/Type.h" +#include "commonj/sdo/Property.h" +namespace commonj{ +namespace sdo{ + + // All delegated to the impl. + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Property.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Property.h new file mode 100644 index 0000000000..2bd52c9ab2 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Property.h @@ -0,0 +1,205 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/06 12:58:18 $ */ + +#ifndef _PROPERTY_H_ +#define _PROPERTY_H_ + + +#include "commonj/sdo/export.h" + +#include "commonj/sdo/Type.h" +#include "commonj/sdo/SDODate.h" + +namespace commonj{ +namespace sdo{ + +class Type; +class TypeImpl; +class DataObject; + +/** + * + * A representation of a property in the type of a data object. + */ + +class Property +{ + public: + + /** getName gets the name of the property + * + * Returns the name of the property. + */ + + // TODO: We would like the returned value to be an SDOString but not until the internals are ready + virtual const SDO_API char* getName() const = 0; + // virtual const SDO_API SDOString& getName() const = 0; + + /** getAlias returns the n'th alias + * + * This method returns a const char* corresponding to the + * alias at index n of the list of aliases. Use getAliasCount to + * discover the size of the list. + */ + + // TODO: We would lke to convert the returned value to an SDOString but that means a rename for the method. + virtual SDO_API const char* getAlias(unsigned int index = 0) const = 0; + + // virtual SDO_API const SDOString& getAlias(unsigned int index = 0) const = 0; + + /** getAliasCount returns the number of aliases + * + * This method returns the number of aliases for this type + */ + + virtual SDO_API unsigned int getAliasCount() const = 0; + + /** getType returns the type of this property + * + * This method returns the type, which may be a DataType or a + * DataObjectType + */ + + virtual SDO_API const Type& getType() const = 0; + + /** getTypeEnum gets the enum for this type. + * + * Each DataType has a defined value in the list of Types. + */ + + virtual SDO_API const Type::Types getTypeEnum() const = 0; + + /** isMany is true if the property is a list + * + * IsMany returns true if this property represents a list of + * values, and should be accessed via the getList DataObjectAPI. + */ + + virtual bool SDO_API isMany() const = 0; + + /** isContainment is true if the property value is contained + * + * IsContainment returns true if this property represents a DataObjectType, + * and that DataObjectType is contained. I.E the property value is not a pointer + * to a DataObject somewhere else in the graph, it is an actual value. + */ + + virtual bool SDO_API isContainment() const = 0; + + /** isReference is true if the property value is not contained + * + * IsReference returns true if this property represents a DataObjectType, + * and that DataObjectType is not contained. I.E the property value is a pointer + * to a DataObject somewhere else in the graph not an actual value. + */ + + virtual bool SDO_API isReference() const = 0; + + /** getContainingType give the type which holds this property. + * + * Although many types may have a property of the same name, any given + * instance of a property belongs to only one type. + * This method returns the type which holds this proeprty. + */ + + virtual SDO_API const Type& getContainingType() const = 0; + + + + /** isReadOnly returns true if the property is unmodifiable. + * + * NOT IMPLEMENTED + * 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. + */ + + virtual bool SDO_API isReadOnly() const = 0; + + /** getOpposite returns the opposite property or zero. + * + * NOT IMPLEMENTED + */ + + virtual SDO_API const Property* getOpposite() const = 0; + + /** isDefaulted is true if a default has been set. + * + * A property value may be set or unset. If unset, requests to the + * data object for the value will return a default if there is one. + * If the property is not defaulted, an un specified value will be + * returned. (Thism value will probably be zero). + */ + + virtual SDO_API bool isDefaulted() const = 0 ; + + /** setDefault sets the right sort of default. + * + * The many overrides of this method allow the setting + * of a default value for any DataType property. + */ + + virtual SDO_API void setDefault(bool b ) = 0; + virtual SDO_API void setDefault(char c) = 0; + virtual SDO_API void setDefault(wchar_t c) = 0; + virtual SDO_API void setDefault(char* c) = 0; + virtual SDO_API void setDefault(const SDOString& c) = 0; + virtual SDO_API void setDefault(short s) = 0; +#if __WORDSIZE !=64 + virtual SDO_API void setDefault(long l) = 0; +#endif + virtual SDO_API void setDefault(int64_t i) = 0; + virtual SDO_API void setDefault(float f) = 0; + virtual SDO_API void setDefault(long double d) = 0; + virtual SDO_API void setDefault(const SDODate d) = 0; + virtual SDO_API void setDefault(const wchar_t* c, unsigned int len) = 0; + virtual SDO_API void setDefault(const char* c, unsigned int len) = 0; + virtual SDO_API void setDefault(const SDOString& c, unsigned int len) = 0; + + /** getDefault gets the right sort of default. + * + * The many overrides of this method allow the getting + * of a default value for any DataType property. + */ + + virtual SDO_API unsigned int getStringDefault(wchar_t* val, unsigned int max) const = 0; + virtual SDO_API unsigned int getBytesDefault(char* val, unsigned int max) const = 0; + virtual SDO_API unsigned int getBytesDefault(SDOString& val, unsigned int max) const = 0; + virtual SDO_API bool getBooleanDefault() const = 0; + virtual SDO_API char getByteDefault() const = 0; + virtual SDO_API wchar_t getCharacterDefault() const = 0; + virtual SDO_API short getShortDefault() const = 0; + virtual SDO_API long getIntegerDefault() const = 0; + virtual SDO_API int64_t getLongDefault() const = 0; + virtual SDO_API float getFloatDefault() const = 0; + virtual SDO_API long double getDoubleDefault() const = 0; + virtual SDO_API const SDODate getDateDefault() const = 0; + virtual SDO_API const char* getCStringDefault() const = 0; + // TODO: Can't overload return types. + // virtual SDO_API const SDOString& getSDOStringDefault() const = 0; + virtual SDO_API unsigned int getDefaultLength() const = 0; + + +}; + + +}; +}; + +#endif //_PROPERTY_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinition.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinition.cpp new file mode 100644 index 0000000000..e83e66d656 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinition.cpp @@ -0,0 +1,285 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/PropertyDefinition.h" +#include "commonj/sdo/PropertyDefinitionImpl.h" + +namespace commonj +{ + namespace sdo + { + + PropertyDefinition::PropertyDefinition() + { + propertydefinition = new PropertyDefinitionImpl(); + } + + PropertyDefinition::~PropertyDefinition() + { + if (propertydefinition) delete propertydefinition; + } + + void PropertyDefinition::copy (const PropertyDefinition& pd) + { + if (propertydefinition != 0) delete propertydefinition; + propertydefinition = new PropertyDefinitionImpl(*(pd.propertydefinition)); + } + + PropertyDefinition::PropertyDefinition(const PropertyDefinition& pd) + { + copy(pd); + } + + PropertyDefinition& PropertyDefinition::operator=(const PropertyDefinition& pd) + { + if (this != &pd) + { + copy(pd); + } + return *this; + } + + PropertyDefinitionImpl* PropertyDefinition::getPropertyDefinition() + { + return propertydefinition; + } + + // where this property is to be substituted for another + void PropertyDefinition::setSubstituteName(const char * name) + { + propertydefinition->substituteName = name; + } + + const char* PropertyDefinition::getSubstituteName() const + { + return (const char *)propertydefinition->substituteName; + } + + + void PropertyDefinition::setSubstituteUri(const char* name) + { + propertydefinition->substituteUri = name; + } + + const char* PropertyDefinition::getSubstituteUri() const + { + return (const char*)propertydefinition->substituteUri; + } + + // where there are substitute names for this property. + void PropertyDefinition::addSubstitute(const char* name, + const char* localname) + { + propertydefinition->substituteNames.push_back(name); + propertydefinition->substituteLocalNames.push_back(localname); + } + + int PropertyDefinition::getSubstituteCount() const + { + return propertydefinition->substituteNames.size(); + } + + const char* PropertyDefinition::getSubstituteNames(int index) const + { + if (index >= 0 && index < propertydefinition->substituteNames.size()) + { + return propertydefinition->substituteNames[index];; + } + return 0; + } + + const char* PropertyDefinition::getSubstituteLocalNames(int index) const + { + if (index >= 0 && index < propertydefinition->substituteLocalNames.size()) + { + return propertydefinition->substituteLocalNames[index];; + } + return 0; + } + + + void PropertyDefinition::setAliases(const char* aliases) + { + propertydefinition->aliases = aliases; + } + + const char* PropertyDefinition::getAliases() const + { + return (const char *)propertydefinition->aliases; + } + + void PropertyDefinition::setName(const char* name) + { + propertydefinition->name = name; + } + + const char* PropertyDefinition::getName() const + { + return (const char *)propertydefinition->name; + } + + void PropertyDefinition::setLocalName(const char* name) + { + propertydefinition->localname = name; + } + + const char* PropertyDefinition::getLocalName() const + { + return (const char*)propertydefinition->localname; + } + + void PropertyDefinition::setType(const char* uri, const char* name) + { + propertydefinition->typeUri = uri; + propertydefinition->typeName = name; + propertydefinition->fullTypeName = uri; + propertydefinition->fullTypeName += "#"; + propertydefinition->fullTypeName += name; + } + + const char * PropertyDefinition::getTypeName() const + { + return propertydefinition->typeName; + } + + const char * PropertyDefinition::getTypeUri() const + { + return propertydefinition->typeUri; + } + + const char * PropertyDefinition::getTypeFullName() const + { + return propertydefinition->fullTypeName; + } + + const char * PropertyDefinition::getTypeFullLocalName() const + { + return propertydefinition->fullLocalTypeName; + } + + void PropertyDefinition::setTypeFullLocalName(const char* name) + { + propertydefinition->fullLocalTypeName = name; + } + + + void PropertyDefinition::setDefaultValue(const char* value) + { + propertydefinition->defaultValue = value; + } + + const char* PropertyDefinition::getDefaultValue() const + { + return propertydefinition->defaultValue; + } + + bool PropertyDefinition::getIsMany() const + { + return propertydefinition->isMany; + } + + bool PropertyDefinition::getIsContainment() const + { + return propertydefinition->isContainment; + } + + bool PropertyDefinition::getIsReadOnly() const + { + return propertydefinition->isReadOnly; + } + + bool PropertyDefinition::getIsID() const + { + return propertydefinition->isID; + } + + bool PropertyDefinition::getIsIDREF() const + { + return propertydefinition->isIDREF; + } + + bool PropertyDefinition::getIsReference() const + { + return propertydefinition->isReference; + } + + bool PropertyDefinition::getIsElement() const + { + return propertydefinition->isElement; + } + + bool PropertyDefinition::getIsQName() const + { + return propertydefinition->isQName; + } + + bool PropertyDefinition::getIsSubstitute() const + { + return propertydefinition->isSubstitute; + } + + + void PropertyDefinition::setIsMany(bool value) + { + propertydefinition->isMany = value; + } + + void PropertyDefinition::setIsContainment(bool value) + { + propertydefinition->isContainment = value; + } + + void PropertyDefinition::setIsReadOnly(bool value) + { + propertydefinition->isReadOnly = value; + } + + void PropertyDefinition::setIsID(bool value) + { + propertydefinition->isID = value; + } + + void PropertyDefinition::setIsIDREF(bool value) + { + propertydefinition->isIDREF = value; + } + + void PropertyDefinition::setIsReference(bool value) + { + propertydefinition->isReference = value; + } + + void PropertyDefinition::setIsElement(bool value) + { + propertydefinition->isElement = value; + } + + void PropertyDefinition::setIsQName(bool value) + { + propertydefinition->isQName = value; + } + + void PropertyDefinition::setIsSubstitute(bool value) + { + propertydefinition->isSubstitute = value; + } + + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinition.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinition.h new file mode 100644 index 0000000000..cb6df88d5f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinition.h @@ -0,0 +1,122 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _PROPERTYDefinition_H_ +#define _PROPERTYDefinition_H_ + +#include "export.h" + +#include <vector> + + + +namespace commonj +{ + namespace sdo + { + + class PropertyDefinitionImpl; + +/** + * PropertyDefinitionImpl holds a property as defined by an XSD. + * The XSD holds more information than does the SDO Property. + * This class holds the extra information found as the XSD is + * parsed. + */ + class SDO_API PropertyDefinition + { + + public: + + + /*SDO_API*/ PropertyDefinition(); + PropertyDefinition(const PropertyDefinition& pd); + PropertyDefinition& operator=(const PropertyDefinition& pd); + + /*SDO_API*/ virtual ~PropertyDefinition(); + + PropertyDefinitionImpl* getPropertyDefinition(); + + + + // where this property is to be substituted for another + /*SDO_API*/ void setSubstituteName(const char * name); + /*SDO_API*/ const char* getSubstituteName() const; + + /*SDO_API*/ void setSubstituteUri(const char* name); + /*SDO_API*/ const char* getSubstituteUri() const; + + // where there are substitute names for this property. + /*SDO_API*/ void addSubstitute(const char* name, + const char* localname); + /*SDO_API*/ int getSubstituteCount() const; + /*SDO_API*/ const char* getSubstituteNames(int index) const; + /*SDO_API*/ const char* getSubstituteLocalNames(int index) const; + + + /*SDO_API*/ void setAliases(const char* aliases); + /*SDO_API*/ const char* getAliases() const; + + /*SDO_API*/ void setName(const char* name); + /*SDO_API*/ const char* getName() const; + + /*SDO_API*/ void setLocalName(const char* name); + /*SDO_API*/ const char* getLocalName() const; + + /*SDO_API*/ void setType(const char* uri, const char* name); + /*SDO_API*/ const char * getTypeName() const; + /*SDO_API*/ const char * getTypeUri() const; + /*SDO_API*/ const char * getTypeFullName() const; + /*SDO_API*/ const char * getTypeFullLocalName() const ; + + /*SDO_API*/ void setTypeFullLocalName(const char* name); + + /*SDO_API*/ void setDefaultValue(const char* value); + /*SDO_API*/ const char* getDefaultValue() const; + + /*SDO_API*/ bool getIsMany() const; + /*SDO_API*/ bool getIsContainment() const; + /*SDO_API*/ bool getIsReadOnly() const; + /*SDO_API*/ bool getIsID() const; + /*SDO_API*/ bool getIsIDREF() const; + /*SDO_API*/ bool getIsReference() const; + /*SDO_API*/ bool getIsElement() const; + /*SDO_API*/ bool getIsQName() const; + /*SDO_API*/ bool getIsSubstitute() const; + + /*SDO_API*/ void setIsMany(bool value); + /*SDO_API*/ void setIsContainment(bool value); + /*SDO_API*/ void setIsReadOnly(bool value); + /*SDO_API*/ void setIsID(bool value); + /*SDO_API*/ void setIsIDREF(bool value); + /*SDO_API*/ void setIsReference(bool value); + /*SDO_API*/ void setIsElement(bool value); + /*SDO_API*/ void setIsQName(bool value); + /*SDO_API*/ void setIsSubstitute(bool value); + + + private: + PropertyDefinitionImpl* propertydefinition; + void copy(const PropertyDefinition& pd); + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_PROPERTYDefinitionImpl_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinitionImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinitionImpl.cpp new file mode 100644 index 0000000000..39b0766b84 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinitionImpl.cpp @@ -0,0 +1,44 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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/PropertyDefinitionImpl.h" +namespace commonj +{ + namespace sdo + { + PropertyDefinitionImpl::PropertyDefinitionImpl() + : isMany(false), + isContainment(true), + isReadOnly(false), + isElement(false), + isReference(false), + isQName(false), + isID(false), + isIDREF(false), + isSubstitute(false) + + { + } + + PropertyDefinitionImpl::~PropertyDefinitionImpl() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinitionImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinitionImpl.h new file mode 100644 index 0000000000..fc0e69a496 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyDefinitionImpl.h @@ -0,0 +1,87 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#ifndef _PROPERTYDefinitionImpl_H_ +#define _PROPERTYDefinitionImpl_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLString.h" +#include <vector> + + + +namespace commonj +{ + namespace sdo + { + + +/** + * PropertyDefinitionImpl holds a property as defined by an XSD. + * The XSD holds more information than does the SDO Property. + * This class holds the extra information found as the XSD is + * parsed. + */ + class PropertyDefinitionImpl + { + + public: + PropertyDefinitionImpl(); + virtual ~PropertyDefinitionImpl(); + + // where this property is to be substituted for another + SDOXMLString substituteName; + SDOXMLString substituteUri; + + // where there are substitute names for this property. + std::vector<SDOXMLString> substituteNames; + std::vector<SDOXMLString> substituteLocalNames; + + SDOXMLString aliases; + + SDOXMLString name; + SDOXMLString localname; + + SDOXMLString typeUri; + SDOXMLString typeName; + SDOXMLString fullTypeName; + + SDOXMLString fullLocalTypeName; + + SDOXMLString defaultValue; + + bool isMany; + bool isContainment; + bool isReadOnly; + + bool isID; + bool isIDREF; + bool isReference; + bool isElement; + + bool isQName; + + bool isSubstitute; + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_PROPERTYDefinitionImpl_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyImpl.cpp new file mode 100644 index 0000000000..ff32f0c33d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyImpl.cpp @@ -0,0 +1,581 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#include <iostream> +using namespace std; + +#ifndef SDO_EXPORTS +#define SDO_EXPORTS +#endif +#include "commonj/sdo/export.h" + + +#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) + { + // name = new char[strlen(inname)+1]; + // strcpy(name,inname); + if (inname != 0) + { + name = inname; + } + else + { + name.erase(); + } + defvalue = 0; + defvaluelength = 0; + opposite = 0; + stringdef = 0; + bisMany = many; + bisReadOnly = ro; + bisContainer = contain; + bDefaulted=false; + if (contain == false && intype.isDataObjectType()) + { + bisReference = true; + } + else + { + bisReference = false; + } + } + + 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), + bisReadOnly(ro), + bisContainer(contain), + bDefaulted(false), + opposite(0), + stringdef(0), + defvalue(0), + defvaluelength(0) + { + if (contain == false && intype.isDataObjectType()) + { + bisReference = true; + } + else + { + bisReference = false; + } + } + + PropertyImpl::PropertyImpl(const PropertyImpl& p) : + type((*(p.getTypeImpl()))), + containertype(p.getContainingType()), + name(p.name), + bisMany(p.bisMany), + bisReadOnly(p.bisReadOnly), + bisContainer(p.bisContainer), + bDefaulted(false), + opposite(0), + defvalue(0), + defvaluelength(0), + stringdef(0) + { + if (bisContainer == false && type.isDataObjectType()) + { + bisReference = true; + } + else + { + bisReference = false; + } + } + + PropertyImpl::~PropertyImpl() + { + if (defvalue != 0) delete (char*)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 (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; + defvaluelength = getTypeImpl()->convert(&defvalue,s); + } + void PropertyImpl::setDefaultCString(const SDOString& s) + { + bDefaulted=true; + defvaluelength = getTypeImpl()->convert(&defvalue, s); + } + void PropertyImpl::setDefaultString( const wchar_t* c , unsigned int len ) + { + bDefaulted=true; + defvaluelength = getTypeImpl()->convert(&defvalue,c, len); + } + void PropertyImpl::setDefaultBytes( const char* c , unsigned int len ) + { + bDefaulted=true; + defvaluelength = getTypeImpl()->convert(&defvalue,c, len); + } + void PropertyImpl::setDefaultBytes(const SDOString& c , unsigned int len) + { + bDefaulted=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; + } + +}; +}; + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyImpl.h new file mode 100644 index 0000000000..3b0838db2c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyImpl.h @@ -0,0 +1,291 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/06 12:58:18 $ */ + +#ifndef _PROPERTYIMPL_H_ +#define _PROPERTYIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/DASProperty.h" +#include "commonj/sdo/SDODate.h" +#include "commonj/sdo/DataFactory.h" + +namespace commonj{ +namespace sdo{ + +class Type; +class TypeImpl; +class DataObject; + +/** + * A substitution is a class which permits a property to be a substitute for + * another one. + * A substitution is a definition of a type which is allowed to be placed in the + * data object in place of a property of another type. + */ + +class Substitution +{ +public: + Substitution(); + Substitution(DataFactoryPtr mdg, const SDOString& inname, + const Type& intype); + Substitution(const Substitution& s); + virtual ~Substitution(); + const Type* type; + SDOString name; +}; + + + +/** PropertyImpl implements the abstract class Property. + * + * A representation of a property in the type of a data object. + */ + +class PropertyImpl :public DASProperty +{ + public: + + + /////////////////////////////////////////////////////////////////////////// + // Construction for the DAS + /////////////////////////////////////////////////////////////////////////// + + SDO_API PropertyImpl( + const Type& cont, + const char* name, + const TypeImpl& type, + bool many = false, + bool ro = false, + bool contain = false); + + SDO_API PropertyImpl(const Type& cont, + const SDOString& name, + const TypeImpl& type, + bool many = false, + bool ro = false, + bool contain = false); + + + + virtual SDO_API ~PropertyImpl(); + + /** + * A Data access service may set the features of this property instead of + * passing them as construction parameters. + */ + + virtual SDO_API void setMany(bool many ); + + /** + * A Data access service may set the features of this property instead of + * passing them as construction parameters. + */ + virtual SDO_API void setReadOnly(bool rdonly); + + /** + * A Data access service may set the features of this property instead of + * passing them as construction parameters. + */ + virtual SDO_API void setContainment(bool contains); + + /** + * A Data access service may set the features of this property instead of + * passing them as construction parameters. + */ + + virtual SDO_API bool isDefaulted() const; + + /** + * A Data access service sets the default value. + */ + + virtual SDO_API void setDefault(bool b ); + virtual SDO_API void setDefault(char c); + virtual SDO_API void setDefault(wchar_t c); + virtual SDO_API void setDefault(char* c); + virtual SDO_API void setDefault(const SDOString& c); + virtual SDO_API void setDefault(short s); +#if __WORDSIZE !=64 + virtual SDO_API void setDefault(long l); +#endif + virtual SDO_API void setDefault(int64_t i); + virtual SDO_API void setDefault(float f); + virtual SDO_API void setDefault(long double d); + virtual SDO_API void setDefault(const SDODate d); + virtual SDO_API void setDefault(const wchar_t* c, unsigned int len); + virtual SDO_API void setDefault(const char* c, unsigned int len); + virtual SDO_API void setDefault(const SDOString& c, unsigned int len); + + + + + + /** + * Returns the name of the property. + */ + + virtual const SDO_API char* getName() const; + + /** getAlias returns the n'th alias + * + * This method returns a const char* corresponding to the + * alias at index n of the list of aliases. Use getAliasCount to + * discover the size of the list. + */ + + virtual const char* getAlias(unsigned int index = 0) const ; + virtual unsigned int getAliasCount() const ; + virtual void setAlias(const char* alias) ; + virtual void setAlias(const SDOString& alias) ; + + /** + * + * SubstitutionGroup support. + */ + + virtual const Type* getSubstitutionType(const char* name) const ; + virtual unsigned int getSubstitutionCount(void) const ; + virtual const Type* getSubstitutionType(unsigned int index) const ; + virtual const char* getSubstitutionName(unsigned int index) const ; + virtual void setSubstitution(DataFactoryPtr mdg, const char* alias, + const Type& substype) ; + + + /** getType returns the type of this property + * + * This method returns the type, which may be a DataType or a + * DataObjectType + */ + + virtual SDO_API const Type& getType() const; + + virtual SDO_API const Type::Types getTypeEnum() const; + + virtual SDO_API const TypeImpl* getTypeImpl() const; + + /** + * Returns whether the property is many-valued. + */ + virtual bool SDO_API isMany() const; + + /** + * Returns whether the property is containment. + */ + virtual bool SDO_API isContainment() const; + + /** + * Returns whether the property is a reference. + */ + virtual bool SDO_API isReference() const; + + /** + * Returns the containing type of this property. + */ + virtual SDO_API const Type& getContainingType() const; + + /** + * returns the opposite property, or zero if there is none + */ + virtual SDO_API const Property* getOpposite() const; + + virtual void setOpposite(const Property* opp); + + + /** + * setters for type primitive types and 'an object' + */ + + SDO_API void setDefaultCString( const char* s); + SDO_API void setDefaultCString(const SDOString& s); + SDO_API void setDefaultString( const wchar_t* c , unsigned int len ); + SDO_API void setDefaultBytes( const char* c , unsigned int len ); + SDO_API void setDefaultBytes(const SDOString& c , unsigned int len); + SDO_API void setDefaultBoolean( const bool b ); + SDO_API void setDefaultByte( const char c ); + SDO_API void setDefaultCharacter( const wchar_t c); + SDO_API void setDefaultShort( const short s ); + SDO_API void setDefaultInteger( const long i ); + SDO_API void setDefaultLong(const int64_t l); + SDO_API void setDefaultFloat( const float f ); + SDO_API void setDefaultDouble( const long double d ); + SDO_API void setDefaultDate( const SDODate d ); + + SDO_API const char* getCStringDefault() const; + SDO_API unsigned int getStringDefault(wchar_t* val, unsigned int max) const; + SDO_API unsigned int getBytesDefault(char* val, unsigned int max) const; + SDO_API unsigned int getBytesDefault(SDOString& val, unsigned int max) const; + SDO_API bool getBooleanDefault() const; + SDO_API char getByteDefault() const; + SDO_API wchar_t getCharacterDefault() const; + SDO_API short getShortDefault() const; + SDO_API long getIntegerDefault() const; + SDO_API int64_t getLongDefault() const; + SDO_API float getFloatDefault() const; + SDO_API long double getDoubleDefault() const; + SDO_API const SDODate getDateDefault() const; + SDO_API unsigned int getDefaultLength() const; + + /** + * 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. + */ + virtual bool SDO_API isReadOnly() const; + + SDO_API PropertyImpl(const PropertyImpl& p); + + private: + + // clear the default value + void deleteValue(); + + bool bisReadOnly; + bool bisContainer; + bool bisReference; + bool bisMany; + + bool bDefaulted; + + const TypeImpl& type; + const Type& containertype; + const Property* opposite; + SDOString name; + char* stringdef; + + void* defvalue; + // in the event of a bytes and string, this holds the length + unsigned int defvaluelength; + + // alias support + // std::vector<char*> aliases; + std::vector<SDOString> aliases; + + std::vector<Substitution> substitutions; + + typedef std::list<PropertyImpl*> REFEREE_LIST; + REFEREE_LIST references; + + +}; +}; +}; + +#endif //_PROPERTYIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyList.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyList.cpp new file mode 100644 index 0000000000..5da678f10b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyList.cpp @@ -0,0 +1,93 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef SDO_EXPORTS + #define SDO_EXPORTS +#endif + +#include "commonj/sdo/export.h" +#include <iostream> +#include "commonj/sdo/Property.h" +#include "commonj/sdo/PropertyImpl.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/PropertyList.h" + +#include "commonj/sdo/Logger.h" + +namespace commonj{ +namespace sdo { + +class Property; + +SDO_API PropertyList::PropertyList(PROPERTY_LIST p) +{ + PROPERTY_LIST::iterator i; + for (i = p.begin(); i != p.end(); ++i) + { + plist.insert(plist.end(),(PropertyImpl*)(*i)); + } +} + +SDO_API PropertyList::PropertyList(PROPERTY_VECTOR p) +{ + plist = PROPERTY_VECTOR(p); +} + +SDO_API PropertyList::PropertyList(const PropertyList &pin) +{ + plist = PROPERTY_VECTOR(pin.getVec()); +} + +SDO_API PropertyList::PropertyList() +{ +} + +SDO_API PropertyList::~PropertyList() +{ +} + +SDO_API Property& PropertyList::operator[] (int pos) +{ + return *(plist[pos]); +} + +SDO_API const Property& PropertyList::operator[] (int pos) const +{ + return *(plist[pos]); +} + +SDO_API int PropertyList::size () +{ + return plist.size(); +} + +SDO_API void PropertyList::insert(const Property& p) +{ + PropertyImpl* pi = (PropertyImpl*)&p; + plist.insert(plist.end(),new PropertyImpl(*pi)); +} + +PROPERTY_VECTOR PropertyList::getVec() const +{ + return plist; +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyList.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyList.h new file mode 100644 index 0000000000..61146f18db --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertyList.h @@ -0,0 +1,87 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _PROPERTYLIST_H_ +#define _PROPERTYLIST_H_ + + +#include "commonj/sdo/export.h" + +#include <vector> +#include <list> + + + + +namespace commonj{ +namespace sdo{ + + class PropertyImpl; + class Property; + typedef std::vector<PropertyImpl*> PROPERTY_VECTOR; +#ifndef PROPERTY_LIST + typedef std::list<PropertyImpl*> PROPERTY_LIST; +#endif + +/** + * This class provides for iteration over a collection of Properties + */ + +class PropertyList +{ +private: + PROPERTY_VECTOR plist; + PROPERTY_VECTOR getVec() const; +public: + SDO_API PropertyList(PROPERTY_VECTOR p); + SDO_API PropertyList(PROPERTY_LIST p); + SDO_API PropertyList(const PropertyList &pin); + SDO_API PropertyList(); + virtual SDO_API ~PropertyList(); + + /** [] + * + * Operator to allow reference to an element of the list. + * There are separate versions for const and variable lists + */ + + SDO_API Property& operator[] (int pos); + SDO_API const Property& operator[] (int pos) const; + + /** size gives the number of elements. + * + * size() returns the number of elements in the list. + */ + + SDO_API int size (); + + /** insert adds an element to the list + * + * insert appends an item to the list. This is not + * of any use to a client application, as these lists + * are always supplied by the library, and are const. + */ + + SDO_API void insert (const Property& p); +}; +}; +}; + + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertySetting.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertySetting.cpp new file mode 100644 index 0000000000..17ac9de09e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertySetting.cpp @@ -0,0 +1,42 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/PropertySetting.h" +namespace commonj +{ + namespace sdo + { + PropertySetting::PropertySetting() + : dataObject(NULL), isNULL(false), isIDREF(false), pendingUnknownType(false) + + { + } + + PropertySetting::PropertySetting(DataObjectPtr dataObj, const SDOXMLString& propertyName, + bool isNull, bool IDREF) + : dataObject(dataObj), name(propertyName), isNULL(isNull),isIDREF(IDREF),pendingUnknownType(false) + { + } + + PropertySetting::~PropertySetting() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertySetting.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertySetting.h new file mode 100644 index 0000000000..4a87e1bc9e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/PropertySetting.h @@ -0,0 +1,61 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _PROPERTYSETTING_H_ +#define _PROPERTYSETTING_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/DataObject.h" + + +namespace commonj +{ + namespace sdo + { + +/** + * PropertySetting holds some information about properties as + * they are read by the parser, for subsequent creation + */ + class PropertySetting + { + + public: + PropertySetting(); + PropertySetting(DataObjectPtr dataObj, + const SDOXMLString& propertyName, + bool isNull=false, + bool isIDREF=false); + virtual ~PropertySetting(); + + SDOXMLString name; + SDOXMLString value; + DataObjectPtr dataObject; + bool isIDREF; + bool isNULL; + bool pendingUnknownType; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_PROPERTYSETTING_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingObject.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingObject.cpp new file mode 100644 index 0000000000..e763ad5a9a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingObject.cpp @@ -0,0 +1,74 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/RefCountingObject.h" +#include "commonj/sdo/Logging.h" + +#include <iostream> +using namespace std; + +namespace commonj{ +namespace sdo{ + +long RefCountingObject::allObs = 0; + +RefCountingObject::RefCountingObject() +: refCount(0) +{ + LOGINFO_2(HIGHVOLUME,"RCO:CREATE:%p Count:%ld",this, ++allObs); +} + +RefCountingObject::RefCountingObject(const RefCountingObject& rc) +: refCount(0) +{ + LOGINFO_2(HIGHVOLUME,"RCO:COPCON:%p Count:%ld",this,++allObs); +} + +RefCountingObject& RefCountingObject::operator=(const RefCountingObject& rc) +{ + return *this; +} + +RefCountingObject::~RefCountingObject() +{ + LOGINFO_2(HIGHVOLUME,"RCO:DELETE:%p Count:%ld",this, --allObs); + // + //if (allObs < 0) + // LOGINFO(HIGHVOLUME,"RCO:More objects deleted than created"); + //if (allObs == 0) + // LOGINFO(HIGHVOLUME,"RCO: All data objects deleted");; +} + +void RefCountingObject::addRef() + +{ + + ++refCount; + LOGINFO_2(HIGHVOLUME,"RCO:ADDREF:%p:%ld",this,refCount); +} + +void RefCountingObject::releaseRef() +{ + LOGINFO_2(HIGHVOLUME,"RCO:DECREF:%p:%ld",this,refCount-1); + if (--refCount == 0) delete this; +} + + +}; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingObject.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingObject.h new file mode 100644 index 0000000000..2d5724a8f5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingObject.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _REFCOUNTINGOBJECT_H +#define _REFCOUNTINGOBJECT_H + + +#include "commonj/sdo/export.h" + + +namespace commonj { + namespace sdo { + +/** + * RefcountingObject is the base class for all objects in SDO + * These objects keep a count of references to themselves, then + * free themselves when they are unused. + */ + class RefCountingObject + { + public: + SDO_API RefCountingObject(); + SDO_API RefCountingObject(const RefCountingObject& rc); + SDO_API RefCountingObject& operator=(const RefCountingObject& rc); + SDO_API virtual ~RefCountingObject() = 0; +/** + * Add to the reference count - a new pointer has been created. + */ + SDO_API void addRef(); +/** + * Subtract from the the reference count - a reference has dropped. + */ + SDO_API void releaseRef(); + + private: + unsigned int refCount; + static long allObs; + }; + + }; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingPointer.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingPointer.cpp new file mode 100644 index 0000000000..a9dabd10b4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingPointer.cpp @@ -0,0 +1,153 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/DataGraph.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/XMLDocument.h" +#include "commonj/sdo/XSDHelper.h" +#include "commonj/sdo/XMLHelper.h" + +namespace commonj{ + namespace sdo{ + + // officially, there is nothing here- but if I dont use the overrides in + // the templates, then they dont get generated. + void Test () + { + +#if defined(WIN32) || defined (_WINDOWS) + /* 1) construct */ + DataFactoryPtr fptr = DataFactory::getDataFactory(); + + /* 2) use the & operator= */ + fptr = DataFactory::getDataFactory(); + + /* 3) copy */ + DataFactoryPtr fptr2 = fptr; + + /* 4) use the == and ! */ + if (fptr2 == fptr || !fptr){} + + /* 5) Use the T* and * */ + DataFactory* dmsf = fptr; + DataFactory& dmsr = *fptr; + + /* 1) construct */ + DataFactoryPtr dfptr(fptr); + + /* 3) copy */ + DataFactoryPtr dfptr2 = dfptr; + + /* 2) use the & operator= */ + dfptr = dfptr2; + + /* 4) use the == and ! */ + if (dfptr2 == dfptr || !dfptr){} + + /* 5) Use the T* and * */ + DataFactory* ddmsf = dfptr; + DataFactory& ddmsr = *dfptr; + + /* 6) Use the -> */ + DataObjectPtr dptr = dfptr->create("nothing","nowhere"); + + /* and agin to catch the = */ + dptr = fptr->create("nothing","nowhere"); + + DataObjectPtr dptr2 = dptr; + + /* Use the T* and * */ + DataObject* dof = dptr; + DataObject& dor = *dptr; + + if (dptr2 == dptr || !dptr){} + + + ChangeSummaryPtr cptr = dptr->getChangeSummary(); + cptr = dptr->getChangeSummary(); + ChangeSummaryPtr cptr2 = cptr; + + ChangeSummary* cof = cptr; + ChangeSummary& cop = *cptr; + + + if (cptr2 == cptr || !cptr){} + + cptr->endLogging(); + + SequencePtr sptr = dptr->getSequence(); + sptr = dptr->getSequence(); + SequencePtr sptr2 = sptr; + + Sequence* sof = sptr; + Sequence& sop = *sptr; + + + if (sptr2 == sptr || !sptr){} + + sptr->getBooleanValue(0); + + + // Generate code for XMLDocumentPtr + XMLDocumentPtr xmldocptr1 = 0; + XMLDocumentPtr xmldocptr2 = xmldocptr1; + xmldocptr1 = xmldocptr2; + if (xmldocptr2 == xmldocptr1 || !xmldocptr1){} + XMLDocument* xmldocp = xmldocptr1; + XMLDocument& xmldocref = *xmldocptr2; + xmldocptr1->getEncoding(); + + // Generate code for XSDHelperPtr + XSDHelperPtr xsdhptr1 = 0; + XSDHelperPtr xsdhptr2 = xsdhptr1; + xsdhptr1 = xsdhptr2; + if (xsdhptr2 == xsdhptr1 || !xsdhptr1){} + XSDHelper* xsdhp = xsdhptr1; + XSDHelper& xsdhref = *xsdhptr2; + xsdhptr1->define("dummy"); + + // Generate code for XMLHelperPtr + XMLHelperPtr xmlhptr1 = 0; + XMLHelperPtr xmlhptr2 = xmlhptr1; + xmlhptr1 = xmlhptr2; + if (xmlhptr2 == xmlhptr1 || !xmlhptr1){} + XMLHelper* xmlhp = xmlhptr1; + XMLHelper& xmlhref = *xmlhptr2; + xmlhptr1->load("dummy"); + + // Generate code for DataGraphPtr + DataGraphPtr dgptr1 = 0; + DataGraphPtr dgptr2 = dgptr1; + dgptr1 = dgptr2; + if (dgptr2 == dgptr1 || !dgptr1){} + DataGraph* dghp = dgptr1; + DataGraph& dgref = *dgptr2; + dgptr1->getRootObject(); + +#endif + + } + }; +}; + + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingPointer.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingPointer.h new file mode 100644 index 0000000000..34d534d1c0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/RefCountingPointer.h @@ -0,0 +1,181 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _REFCOUNTINGPOINTER_H +#define _REFCOUNTINGPOINTER_H + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/SDORuntimeException.h" + +#include <iostream> + +namespace commonj{ +namespace sdo{ + +/** + * RefcountingPointer is a template for all SDO pointers. + * The ref count increases with each use, and drops when one of these + * goes out of scope. + * Refcounting pointers are a lot like smart pointers, however in this + * implementation there is a cast method to a void*, so unlike real + * smart pointers, a user might call "delete mypointer", which would + * compile, but cause a crash. + * RefCountingPointers do not need to be deleted. + */ + +template <class T> +class RefCountingPointer { + public: + /*SDO_API*/ RefCountingPointer(T* realPtr = 0); + /*SDO_API*/ RefCountingPointer(const RefCountingPointer& rhs); + /*SDO_API*/ ~RefCountingPointer(); + /*SDO_API*/ RefCountingPointer& operator=(const RefCountingPointer& rhs); + /*SDO_API*/ bool operator==(RefCountingPointer& test) const; + /*SDO_API*/ T* operator->() const; + /*SDO_API*/ T& operator*() const; + /*SDO_API*/ bool operator!() const; + +#ifdef MFT + // MFT == member function templates + // Notes on the items below. + // In our code, we use subclasses to expose the API, and super + // classes to implement. E,g DataObject and DataObjectImpl. + // In some cases, we know that the DataObject given to us is a + // DataObjectImpl, and cast it. With RefCountingPointers, however, + // the cast cannot work, as the RefCountingPointer to the superclass + // is not related to the RCP to the subclass. Recent changes in the + // C++ language allow this to work by defining an operator which + // causes a pointer of the other type to be returned, as long as pointee + // is acceptable as a parameter to the cosntructor of the other type + // of pointer. This works in C++.NET, but not in C++6: + operator RefCountingPointer<otherType>() + { + return RefCountingPointer<otherType>(pointee); + } + + // Since we are using C6, a possible workround is to provide a method + // which returns the dumb pointer, then construct a pointer to the + // base class from the pointer returned. This is that the operator T* does. + // The code in DataObject could be simpler if we used C7,and we should + // discusss changing. +#else + operator T*() {return pointee;} +#endif + + template <class otherType> + operator RefCountingPointer<otherType>() + { + return RefCountingPointer<otherType>(pointee); + } + + private: + T *pointee; + void init(); +}; + + + +template<class T> +void RefCountingPointer<T>::init() +{ + if (pointee == 0) return; + pointee->addRef(); +} + +template<class T> +/*SDO_API*/ RefCountingPointer<T>::RefCountingPointer(T* realPtr) +:pointee(realPtr) +{ + init(); +} + +template<class T> +/*SDO_API*/ RefCountingPointer<T>::RefCountingPointer(const RefCountingPointer& rhs) +: pointee(rhs.pointee) +{ + init(); +} + +template<class T> +/*SDO_API*/ RefCountingPointer<T>::~RefCountingPointer() +{ + if (pointee)pointee->releaseRef(); +} + +template<class T> +/*SDO_API*/ RefCountingPointer<T>& RefCountingPointer<T>::operator=(const RefCountingPointer& rhs) +{ + if (pointee != rhs.pointee) + { + T *oldP = pointee; + pointee = rhs.pointee; + init(); + if (oldP) oldP->releaseRef(); + } + return *this; +} + +template<class T> +/*SDO_API*/ bool RefCountingPointer<T>::operator!() const +{ + return (pointee == 0); +} + +template<class T> +/*SDO_API*/ bool RefCountingPointer<T>::operator==(RefCountingPointer& test) const +{ + return (pointee == test.pointee); +} + +template<class T> +/*SDO_API*/ T* RefCountingPointer<T>::operator->() const +{ + if (pointee == 0) + SDO_THROW_EXCEPTION("Pointer",SDONullPointerException, ""); + return pointee; +} + +template<class T> +/*SDO_API*/ T& RefCountingPointer<T>::operator*() const +{ + return *pointee; +} + +class DataObject; +typedef RefCountingPointer<DataObject> DataObjectPtr; +class DataGraph; +typedef RefCountingPointer<DataGraph> DataGraphPtr; +class DataFactory; +typedef RefCountingPointer<DataFactory> DataFactoryPtr; +class Sequence; +typedef Sequence* SequencePtr; +class ChangeSummary; +typedef ChangeSummary* ChangeSummaryPtr; +class XMLDocument; +typedef RefCountingPointer<XMLDocument> XMLDocumentPtr; +class XSDHelper; +typedef RefCountingPointer<XSDHelper> XSDHelperPtr; +class XMLHelper; +typedef RefCountingPointer<XMLHelper> XMLHelperPtr; + +}; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attribute.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attribute.cpp new file mode 100644 index 0000000000..921b13fe02 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attribute.cpp @@ -0,0 +1,49 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SAX2Attribute.h" + + +namespace commonj +{ + namespace sdo + { + +/** + * SAX2Attribute holds an attribute supplied by the SAX2 parser. + */ + SAX2Attribute::SAX2Attribute() + { + } + + SAX2Attribute::SAX2Attribute(const xmlChar **attribute) // localname/prefix/URI/value/end + { + name = attribute[0]; + prefix = attribute[1]; + uri = attribute[2]; + value = SDOXMLString(attribute[3],0, (int)(attribute[4] - attribute[3])); + } + + SAX2Attribute::~SAX2Attribute() + { + } + + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attribute.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attribute.h new file mode 100644 index 0000000000..a8657ab6ef --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attribute.h @@ -0,0 +1,64 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SAX2ATTRIBUTE_H_ +#define _SAX2ATTRIBUTE_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLString.h" + +namespace commonj +{ + namespace sdo + { + +/** + * SAX2Attribute holds an attribute supplied by the SAX2 parser. + */ + + class SAX2Attribute + { + + public: + + SAX2Attribute(); + SAX2Attribute(const xmlChar **attribute); + + virtual ~SAX2Attribute(); + + const SDOXMLString& getName() const {return name;} + const SDOXMLString& getPrefix() const {return prefix;} + const SDOXMLString& getUri() const {return uri;} + const SDOXMLString& getValue() const {return value;} + + + private: + SDOXMLString name; + SDOXMLString prefix; + SDOXMLString uri; + SDOXMLString value; + + + + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif //_SAX2ATTRIBUTE_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp new file mode 100644 index 0000000000..145f91ed1d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp @@ -0,0 +1,96 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/07 13:35:33 $ */ + +#include "commonj/sdo/SAX2Attributes.h" + +namespace commonj +{ + namespace sdo + { + +/** + * SAX2Attributes holds a list of attributes supplied by the SAX2 parser. + */ + SAX2Attributes::SAX2Attributes( + int nb_attributes, + int nb_defaulted, + const xmlChar **attrs) // localname/prefix/URI/value/end + { + for (int i=0; i < nb_attributes*5; i+=5) + { + attributes.insert(attributes.end(), SAX2Attribute(&attrs[i])); + } + } + + SAX2Attributes::SAX2Attributes() + { + } + + SAX2Attributes::~SAX2Attributes() + { + } + + const SAX2Attribute& SAX2Attributes::operator[] (int pos) const + { + return attributes[pos]; + } + + int SAX2Attributes::size () const + { + return attributes.size(); + } + + + const SDOXMLString SAX2Attributes::nullValue; + + const SDOXMLString& SAX2Attributes::getValue( + const SDOXMLString& attributeUri, + const SDOXMLString& attributeName) const + { + for (int i=0; i < attributes.size(); i++) + { + if (attributes[i].getUri().equalsIgnoreCase(attributeUri)) + { + if (attributes[i].getName().equalsIgnoreCase(attributeName)) + { + return attributes[i].getValue(); + } + } + } + + return nullValue; + } + + const SDOXMLString& SAX2Attributes::getValue( + const SDOXMLString& attributeName) const + { + for (int i=0; i < attributes.size(); i++) + { + if (attributes[i].getName().equalsIgnoreCase(attributeName)) + { + return attributes[i].getValue(); + } + } + + return nullValue; + } + + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h new file mode 100644 index 0000000000..0a0ce792a3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h @@ -0,0 +1,74 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/07 13:35:33 $ */ + +#ifndef _SAX2ATTRIBUTES_H_ +#define _SAX2ATTRIBUTES_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SAX2Attribute.h" + +#include "vector" + + +namespace commonj +{ + namespace sdo + { + +/** + * SAX2Attributes holds a list of attributes supplied by the SAX2 parser. + */ + class SAX2Attributes + { + + public: + + SAX2Attributes(); + + SAX2Attributes( + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes); + + virtual ~SAX2Attributes(); + + const SAX2Attribute& operator[] (int pos) const; + int size() const; + + const SDOXMLString& getValue( + const SDOXMLString& attributeUri, + const SDOXMLString& attributeName) const; + + const SDOXMLString& getValue( + const SDOXMLString& attributeName) const; + + private: + typedef std::vector<SAX2Attribute> ATTRIBUTE_LIST; + ATTRIBUTE_LIST attributes; + + static const SDOXMLString nullValue; + + + + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif //_SAX2ATTRIBUTES_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Namespaces.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Namespaces.cpp new file mode 100644 index 0000000000..ae99c4949e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Namespaces.cpp @@ -0,0 +1,93 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SAX2Namespaces.h" + + +namespace commonj +{ + namespace sdo + { + + SAX2Namespaces::SAX2Namespaces() + { + } + + SAX2Namespaces::SAX2Namespaces(int nb_namespaces, const xmlChar** namespaces) + { + for (int i=0; i<nb_namespaces*2; i+=2) + { + namespaceMap[namespaces[i]] = namespaces[i+1]; + } + } + + SAX2Namespaces::~SAX2Namespaces() + { + } + + const SDOXMLString* SAX2Namespaces::find(const SDOXMLString& prefix) const + { + NAMESPACE_MAP::const_iterator nsIter; + nsIter = namespaceMap.find(prefix); + if(nsIter == namespaceMap.end()) + { + return 0; + } + + return &(nsIter->second); + + } + + const SDOXMLString* SAX2Namespaces::findPrefix(const SDOXMLString& uri) const + { + NAMESPACE_MAP::const_iterator nsIter; + for (nsIter = namespaceMap.begin(); nsIter != namespaceMap.end(); nsIter++) + { + if (nsIter->second.equals(uri)) + return &(nsIter->first); + } + return 0; + } + + void SAX2Namespaces::merge(const SAX2Namespaces& inspaces) + { + NAMESPACE_MAP::const_iterator nsIter; + for (nsIter = inspaces.namespaceMap.begin(); + nsIter != inspaces.namespaceMap.end(); nsIter++) + { + // add will not overwrite if it already exists + namespaceMap[nsIter->first] = nsIter->second; + } + return; + } + + + + void SAX2Namespaces::add(const SDOXMLString& prefix, const SDOXMLString& uri) + { + namespaceMap[prefix] = uri; + } + + void SAX2Namespaces::empty() + { + namespaceMap.empty(); + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Namespaces.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Namespaces.h new file mode 100644 index 0000000000..d100889544 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Namespaces.h @@ -0,0 +1,67 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SAX2NAMESPACES_H_ +#define _SAX2NAMESPACES_H_ +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLString.h" +#include "map" + + +namespace commonj +{ + namespace sdo + { + +/** + * SAX2Namespaces holds a list of namespaces supplied by the SAX2 parser. + */ + + class SAX2Namespaces + { + + public: + + SAX2Namespaces(); + + SAX2Namespaces(int nb_namespaces, const xmlChar** namespaces); + + virtual ~SAX2Namespaces(); + + void add(const SDOXMLString& prefix, const SDOXMLString& uri); + + void merge(const SAX2Namespaces& inspaces); + + const SDOXMLString* find(const SDOXMLString& prefix) const; + const SDOXMLString* findPrefix(const SDOXMLString& uri) const; + + void empty(); + + private: + typedef std::map<SDOXMLString, SDOXMLString> NAMESPACE_MAP; + NAMESPACE_MAP namespaceMap; + + + + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif //_SAX2NAMESPACES_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Parser.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Parser.cpp new file mode 100644 index 0000000000..b38c67061d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Parser.cpp @@ -0,0 +1,516 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#include "commonj/sdo/SAX2Parser.h" +#include "libxml/SAX2.h" +#include "commonj/sdo/SDORuntimeException.h" +using namespace commonj::sdo; + +/** + * SAX2Parser holds the methods which will be called back. + * The implementation uses libxml, which provides callbacks for + * errors, warnings , elements etc. These methods correspond to thos + * callbacks. + * Callbacks from libxml to these C methods are converted into calls + * to the C++ equivalent (with some parameter manipulation + * In the callback methods the void* ctx is a pointer to 'this' SAX2Parser + */ + + + +int sdo_isStandalone(void *ctx) +{ + return 0; +} + + +int sdo_hasInternalSubset(void *ctx) +{ + return(0); +} + +int sdo_hasExternalSubset(void *ctx) +{ + return(0); +} + +void sdo_internalSubset(void *ctx, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) +{ +} + + +void sdo_externalSubset(void *ctx, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) +{ +} + +xmlParserInputPtr sdo_resolveEntity(void *ctx, const xmlChar *publicId, const xmlChar *systemId) +{ + return(NULL); +} + + +xmlEntityPtr sdo_getEntity(void *ctx, const xmlChar *name) +{ + return(NULL); +} + + +xmlEntityPtr sdo_getParameterEntity(void *ctx, const xmlChar *name) +{ + return(NULL); +} + + +void sdo_entityDecl(void *ctx, const xmlChar *name, int type, + const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) +{ +} + + +void sdo_attributeDecl(void *ctx, const xmlChar * elem, + const xmlChar * name, int type, int def, + const xmlChar * defaultValue, xmlEnumerationPtr tree) +{ +} + +void sdo_elementDecl(void *ctx, const xmlChar *name, int type, + xmlElementContentPtr content) +{ +} + + +void sdo_notationDecl(void *ctx, const xmlChar *name, + const xmlChar *publicId, const xmlChar *systemId) +{ +} + +void sdo_unparsedEntityDecl(void *ctx, const xmlChar *name, + const xmlChar *publicId, const xmlChar *systemId, + const xmlChar *notationName) +{ +} + + +void sdo_setDocumentLocator(void *ctx, xmlSAXLocatorPtr loc) +{ +} + + +void sdo_startDocument(void *ctx) +{ + if (!((SAX2Parser*)ctx)->parserError) + ((SAX2Parser*)ctx)->startDocument(); +} + + +void sdo_endDocument(void *ctx) +{ + if (!((SAX2Parser*)ctx)->parserError) + ((SAX2Parser*)ctx)->endDocument(); +} + + +void sdo_startElement(void *ctx, const xmlChar *name, const xmlChar **atts) +{ + // ((SAX2Parser*)ctx)->startElement(name, atts); +} + + +void sdo_endElement(void *ctx, const xmlChar *name) +{ + // ((SAX2Parser*)ctx)->endElement(name); +} + + +void sdo_characters(void *ctx, const xmlChar *ch, int len) +{ + if (!((SAX2Parser*)ctx)->parserError) + ((SAX2Parser*)ctx)->characters(SDOXMLString(ch, 0, len)); +} + + +void sdo_reference(void *ctx, const xmlChar *name) +{ +} + + +void sdo_ignorableWhitespace(void *ctx, const xmlChar *ch, int len) +{ +} + + +void sdo_processingInstruction(void *ctx, const xmlChar *target, + const xmlChar *data) +{ +} + + +void sdo_cdataBlock(void *ctx, const xmlChar *value, int len) +{ +} + +void sdo_comment(void *ctx, const xmlChar *value) +{ +} + + +void sdo_warning(void *ctx, const char *msg, ...) +{ + va_list args; + va_start(args, msg); + ((SAX2Parser*)ctx)->warning(msg, args); + va_end(args); +} + +void sdo_error(void *ctx, const char *msg, ...) +{ + va_list args; + va_start(args, msg); + ((SAX2Parser*)ctx)->error(msg, args); + va_end(args); + + +} + +void sdo_fatalError(void *ctx, const char *msg, ...) +{ + va_list args; + va_start(args, msg); + ((SAX2Parser*)ctx)->fatalError(msg, args); + va_end(args); +} + + + +// =============== +// SAX2 callbacks +// =============== +void sdo_startElementNs(void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI, + int nb_namespaces, + const xmlChar **namespaces, + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes) +{ + if (!((SAX2Parser*)ctx)->parserError) + ((SAX2Parser*)ctx)->startElementNs( + localname, + prefix, + URI, + SAX2Namespaces(nb_namespaces, namespaces), + SAX2Attributes(nb_attributes, nb_defaulted, attributes)); +} + + +void sdo_endElementNs(void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI) +{ + if (!((SAX2Parser*)ctx)->parserError) + ((SAX2Parser*)ctx)->endElementNs(localname, prefix, URI); +} + + +// The callback method structure +xmlSAXHandler SDOSAX2HandlerStruct = { + sdo_internalSubset, + sdo_isStandalone, + sdo_hasInternalSubset, + sdo_hasExternalSubset, + sdo_resolveEntity, + sdo_getEntity, + sdo_entityDecl, + sdo_notationDecl, + sdo_attributeDecl, + sdo_elementDecl, + sdo_unparsedEntityDecl, + sdo_setDocumentLocator, + sdo_startDocument, + sdo_endDocument, + sdo_startElement, + sdo_endElement, + sdo_reference, + sdo_characters, + sdo_ignorableWhitespace, + sdo_processingInstruction, + sdo_comment, + sdo_warning, + sdo_error, + sdo_fatalError, + sdo_getParameterEntity, + sdo_cdataBlock, + sdo_externalSubset, + XML_SAX2_MAGIC, + NULL, + sdo_startElementNs, + sdo_endElementNs, + NULL +}; + + +namespace commonj +{ + namespace sdo + { + + + + + SAX2Parser::SAX2Parser() + { + setter = 0; + parserError = false; + currentFile = 0; + } + + SAX2Parser::SAX2Parser(ParserErrorSetter* insetter) + { + setter = insetter; + parserError = false; + currentFile = 0; + } + + SAX2Parser::~SAX2Parser() + { + // xmlCleanupParser(); + if (currentFile != 0)delete currentFile; + + } + + const char* SAX2Parser::getCurrentFile() const + { + return currentFile; + } + + + void SAX2Parser::setCurrentFile(const char* filename) + { + if (currentFile != 0) + { + delete currentFile; + } + currentFile = new char[strlen(filename)+1]; + strcpy(currentFile,filename); + } + + int SAX2Parser::parse(const char* filename) + { + + parserError = false; + xmlSAXHandlerPtr handler = &SDOSAX2HandlerStruct; + + if (currentFile != 0) + { + delete currentFile; + } + currentFile = new char[strlen(filename)+1]; + strcpy(currentFile,filename); + + + int rc = xmlSAXUserParseFile(handler, this, filename); + if (rc == -1) + { + sdo_error(this, "xmlSAXUserParseFile returned an error %d", rc); + SDO_THROW_EXCEPTION("parse", SDOFileNotFoundException,messageBuffer); + } + return rc; + } + + void SAX2Parser::startDocument() + { + } + + void SAX2Parser::endDocument() + { + } + + void SAX2Parser::startElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + } + + void SAX2Parser::endElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI) + { + } + + void SAX2Parser::characters(const SDOXMLString& chars) + { + } + + + void SAX2Parser::warning(const char* msg, va_list args) + { + // warnings are perhaps too frequent + // vsprintf(messageBuffer, msg, args); + // if (setter != 0)setter->setError(messageBuffer); + } + + void SAX2Parser::fatalError(const char* msg, va_list args) + { + parserError = true; + vsprintf(messageBuffer, msg, args); + if (setter != 0)setter->setError(messageBuffer); + } + + void SAX2Parser::error(const char* msg, va_list args) + { + vsprintf(messageBuffer, msg, args); + if (setter != 0)setter->setError(messageBuffer); + } + + + void SAX2Parser::stream(std::istream& input) + { + char buffer[100]; + xmlSAXHandlerPtr handler = &SDOSAX2HandlerStruct; + parserError = false; + xmlParserCtxtPtr ctxt; + + input.read(buffer,4); + ctxt = xmlCreatePushParserCtxt(handler, this, + buffer, input.gcount(), NULL); + + while (input.read(buffer,100)) + { + xmlParseChunk(ctxt, buffer, input.gcount(), 0); + + } + + xmlParseChunk(ctxt, buffer, input.gcount(), 1); + xmlFreeParserCtxt(ctxt); + + if (parserError) + { + SDO_THROW_EXCEPTION("stream", SDOXMLParserException,messageBuffer); + } + + } + + int SAX2Parser::parse_twice(const char* filename) + { + parserError = false; + xmlSAXHandlerPtr handler = &SDOSAX2HandlerStruct; + + setCurrentFile(filename); + + int rc = xmlSAXUserParseFile(handler, this, filename); + if (rc == -1) + { + sdo_error(this, "xmlSAXUserParseFile returned an error %d", rc); + SDO_THROW_EXCEPTION("parse", SDOFileNotFoundException,messageBuffer); + } + + // parse twice - first was for groups + + if (setter)setter->clearErrors(); + + rc = xmlSAXUserParseFile(handler, this, filename); + if (rc == -1) + { + sdo_error(this, "xmlSAXUserParseFile returned an error %d", rc); + SDO_THROW_EXCEPTION("parse", SDOFileNotFoundException,messageBuffer); + } + return rc; + } + + void SAX2Parser::stream_twice(std::istream& input) + { + + std::vector<parse_buf_element> buffer_vec; + int count = 0; + parserError = false; + + xmlSAXHandlerPtr handler = &SDOSAX2HandlerStruct; + xmlParserCtxtPtr ctxt; + + char bctx[5]; + input.read(bctx,4); + int bcount = input.gcount(); + + + ctxt = xmlCreatePushParserCtxt(handler, this, + bctx, bcount, NULL); + + buffer_vec.push_back(parse_buf_element()); + + while (input.read(buffer_vec[count].buf,1000)) + { + buffer_vec[count].len = input.gcount(); + xmlParseChunk(ctxt, buffer_vec[count].buf, + buffer_vec[count].len, 0); + buffer_vec.push_back(parse_buf_element()); + count++; + + } + + buffer_vec[count].len = input.gcount(); + xmlParseChunk(ctxt, buffer_vec[count].buf, + buffer_vec[count].len, 1); + xmlFreeParserCtxt(ctxt); + + if (parserError) + { + SDO_THROW_EXCEPTION("stream", SDOXMLParserException,messageBuffer); + } + + if (setter)setter->clearErrors(); + + ctxt = xmlCreatePushParserCtxt(handler, this, + bctx, bcount, NULL); + + for (int i=0;i<buffer_vec.size();i++) + { + if (buffer_vec[i].len > 0) + { + xmlParseChunk(ctxt, buffer_vec[i].buf, + buffer_vec[i].len, 0); + } + } + + if (parserError) + { + SDO_THROW_EXCEPTION("stream", SDOXMLParserException,messageBuffer); + } + + } + + + std::istream& operator>>(std::istream& input, SAX2Parser& parser) + { + parser.stream(input); + return input; + } + + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Parser.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Parser.h new file mode 100644 index 0000000000..6e81bc98b7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SAX2Parser.h @@ -0,0 +1,115 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#ifndef _SAX2PARSER_H_ +#define _SAX2PARSER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/SAX2Attributes.h" +#include "commonj/sdo/ParserErrorSetter.h" + + + +#include "sstream" +namespace commonj +{ + namespace sdo + { + + class parse_buf_element + { + + public: + char buf[1000]; + int len; + }; + +/** + * SAX2Parser holds the methods which will be called back. + * The implementation uses libxml, which provides callbacks for + * errors, warnings , elements etc. These methods correspond to thos + * callbacks. + * Callbacks from libxml to these C methods are converted into calls + * to the C++ equivalent (with some parameter manipulation + * In the callback methods the void* ctx is a pointer to 'this' SAX2Parser + */ + class SAX2Parser + { + + public: + + SAX2Parser(); + + SAX2Parser(ParserErrorSetter* insetter); + + virtual ~SAX2Parser(); + + virtual int parse (const char* filename); + virtual int parse_twice (const char* filename); + + virtual void startDocument(); + virtual void endDocument(); + + virtual void startElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void endElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI); + + virtual void characters(const SDOXMLString& chars); + + virtual void warning(const char* msg, va_list args); + + virtual void fatalError(const char* msg, va_list args); + + virtual void error(const char* msg, va_list args); + + virtual void stream(std::istream& input); + virtual void stream_twice(std::istream& input); + + friend std::istream& operator>>(std::istream& input, SAX2Parser& parser); + + ParserErrorSetter* setter; + bool parserError; + + char messageBuffer[1024]; + + virtual const char* getCurrentFile() const; + virtual void setCurrentFile(const char* filename); + + private: + + char* currentFile; + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SAX2PARSER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDO.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDO.h new file mode 100644 index 0000000000..674edf0719 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDO.h @@ -0,0 +1,60 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/PropertyList.h" +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/TypeList.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/DataObjectList.h" +#include "commonj/sdo/XSDHelper.h" +#include "commonj/sdo/XMLHelper.h" +#include "commonj/sdo/EqualityHelper.h" +#include "commonj/sdo/CopyHelper.h" +#include "commonj/sdo/SdoRuntime.h" +#include "commonj/sdo/HelperProvider.h" +#include "commonj/sdo/SDODate.h" +#include "commonj/sdo/DataGraph.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/export.h" +#include "commonj/sdo/SDOUtils.h" +#include "commonj/sdo/ChangedDataObjectList.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/DataObjectInstance.h" +#include "commonj/sdo/DefaultLogWriter.h" +#include "commonj/sdo/Logger.h" +#include "commonj/sdo/LogWriter.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/RefCountingObject.h" +#include "commonj/sdo/SdoCheck.h" +#include "commonj/sdo/Setting.h" +#include "commonj/sdo/SettingList.h" +#include "commonj/sdo/XMLDocument.h" +#include "commonj/sdo/DASValue.h" +#include "commonj/sdo/XpathHelper.h" +#include "commonj/sdo/TypeDefinition.h" +#include "commonj/sdo/TypeDefinitions.h" +#include "commonj/sdo/PropertyDefinition.h" + + + + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDODate.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDODate.cpp new file mode 100644 index 0000000000..50ae8b2297 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDODate.cpp @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SDODate.h" + +namespace commonj{ +namespace sdo{ + + + SDODate::~SDODate() + { + } + + SDODate::SDODate(time_t inval) + { + value = inval; + } + + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + + const time_t SDODate::getTime(void) const + { + return value; + } + + const char* SDODate::ascTime(void) const + { + return asctime(localtime(&value)); + } + +}; +}; +// end - namespace sdo + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDODate.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDODate.h new file mode 100644 index 0000000000..da900cb298 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDODate.h @@ -0,0 +1,77 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SDO_SDODATE_H_ +#define _SDO_SDODATE_H_ + + +#include "commonj/sdo/export.h" +#include "time.h" + + + + +namespace commonj{ +namespace sdo{ + + + /////////////////////////////////////////////////////////////////////////// + // A representation of the type of a date. + /////////////////////////////////////////////////////////////////////////// + +/** + * SDODate - a means of hiding the time_t. + * The SDO API in several places uses method overloads to allow the + * same method to set many types of data. As time_t and long are + * sometimes synonymous, it was not possible to have a time_t and a + * long method, so SDODate simply wraps the time_t. + * SDODate also allows modifcation of the implementation, as time_t is + * only a short-term solution - better date/time handling is required. + */ + +class SDODate +{ + +public: + + + virtual SDO_API ~SDODate(); + + SDO_API SDODate(time_t inval); + + /** + * Hand out the date as a time_t + */ + virtual SDO_API const time_t getTime() const; + + /** + * Format the date as a string + */ + + virtual const char* ascTime(void) const; + + +private: + time_t value; +}; + +}; +}; +#endif //_SDO_SDODATE_H_ + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDORuntimeException.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDORuntimeException.cpp new file mode 100644 index 0000000000..4a60d78f0d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDORuntimeException.cpp @@ -0,0 +1,227 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/01/23 16:39:24 $ */ + +#include "commonj/sdo/SDORuntimeException.h" + +#include <stdio.h> + +// ======================================================================== +// Constructor +// ======================================================================== +SDORuntimeException :: SDORuntimeException(const char* name, + severity_level sev, + const char* msg_text) + : severity(sev),location_set(0) +{ + class_name = new char[strlen(name) + 1]; + strcpy(class_name,name); + message_text = new char[strlen(msg_text)+1]; + strcpy(message_text,msg_text); + +} // end SDORuntimeException constuctor + +// ======================================================================== +// Constructor +// ======================================================================== +SDORuntimeException :: SDORuntimeException(const SDORuntimeException& c) + : + severity(c.getSeverity()), location_set(c.location_set) + +{ + class_name = new char[strlen(c.getEClassName()) + 1]; + strcpy(class_name, c.getEClassName()); + message_text = new char[strlen(c.getMessageText())+1]; + strcpy(message_text,c.getMessageText()); + for (int i=0;i<c.location_set;i++) + { + locations[i].file = new char[strlen(c.locations[i].file) + 1]; + strcpy(locations[i].file,c.locations[i].file); + locations[i].line = c.locations[i].line; + locations[i].function = new char[strlen(c.locations[i].function) + 1]; + strcpy(locations[i].function, c.locations[i].function); + } +} + +// ======================================================================== +// Destructor +// ======================================================================== +SDORuntimeException :: ~SDORuntimeException() +{ + if (class_name) delete class_name; + if (message_text) delete message_text; + for (int i=0;i<location_set;i++) + { + if (locations[i].file) delete locations[i].file; + if (locations[i].function) delete locations[i].function; + } + +} // end SDORuntimeException destructor + +// ======================================================================== +// Return class name of this exception +// ======================================================================== +const char* SDORuntimeException :: getEClassName() const +{ + return class_name; +} // end getClassName() + +// ======================================================================== +// Return severity +// ======================================================================== +SDORuntimeException::severity_level SDORuntimeException :: getSeverity() const +{ + return severity; +} // end getSeverity() + +// ======================================================================== +// Return message text associated with exception +// ======================================================================== +const char* SDORuntimeException :: getMessageText() const +{ + return message_text; +} // end getMessageText() + +// ======================================================================== +// Return file name where exception was raised +// ======================================================================== +const char* SDORuntimeException :: getFileName() const +{ + return locations[0].file; +} // end getFileName() + +// ======================================================================== +// Return line number where exception was raised +// ======================================================================== +unsigned long SDORuntimeException :: getLineNumber() const +{ + return locations[0].line; +} // end getLineNumber() + +// ======================================================================== +// Return function name where exception was raised +// ======================================================================== +const char* SDORuntimeException :: getFunctionName() const +{ + return locations[0].function; +} // end getFunctionName() + + +// ======================================================================== +// set severity of exception +// ======================================================================== +void SDORuntimeException :: setSeverity(severity_level sev) +{ + severity = sev; +} // end setSeverity(severity_level sev) const + +// ======================================================================== +// set message text associated with exception +// ======================================================================== +void SDORuntimeException :: setMessageText(const char* msg_text) +{ + if (message_text != 0) delete message_text; + message_text = new char[strlen(msg_text) + 1]; + strcpy(message_text,msg_text); +} // end setMessageText(const string &msg_text) const + +// ======================================================================== +// set exception location +// ======================================================================== +void SDORuntimeException :: setExceptionLocation(const char* file, + unsigned long line, + const char* function) +{ + // Only set this information once + if (location_set == 0) + { + locations[0].file = new char[strlen(file)+1]; + strcpy(locations[0].file,file); + locations[0].line = line; + locations[0].function = new char[strlen(function) + 1]; + strcpy(locations[0].function,function); + location_set = 1; + } +} // end setLocation() + +// ======================================================================== +// set location of most recent throw/handling of the exception +// ======================================================================== +void SDORuntimeException :: setLocation(const char* file, + unsigned long line, + const char* function) +{ + if (location_set < num_locations) + { + locations[location_set].file = new char[strlen(file) + 1]; + strcpy(locations[location_set].file,file); + locations[location_set].line = line; + locations[location_set].function = new char[strlen(function) + 1]; + strcpy(locations[location_set].function,function); + + location_set++; + } +} // end setLocation() + +// ======================================================================== +// Trace the exception +// ======================================================================== +void SDORuntimeException :: trace(const char* text) +{ + /* TODO */ + // TRACE_STREAM(0, SDORuntimeException::trace, " ", (*this)); +} // end Trace() + +// ======================================================================== +// print self +// ======================================================================== +std::ostream& SDORuntimeException :: PrintSelf(std::ostream &os) const +{ + char lineNumber[100]; + sprintf(lineNumber, "%d",locations[0].line); + + os << "Exception object :" << std::endl; + os << " class: " << class_name << std::endl; + os << " file name: " << locations[0].file << std::endl; + os << " line number: " << lineNumber << std::endl; + os << " function: " << locations[0].function << std::endl; + os << " description: " << message_text << std::endl; + os << " location history:" << std::endl; + + // TODO - commented out - a two-location rethrow causes an access + // violation here. + //int i=1; + //while (i < location_set) + //{ + // os << " " << i << ")" << std::endl; + // os << " file: " << locations[i].file << std::endl; + // os << " line: " << locations[i].line << std::endl; + // os << " function: " << locations[i].function << std::endl; + // i++; + //} + return os; +} // end ostream operator << + +// ======================================================================== +// ostream operator << +// ======================================================================== +SDO_API std::ostream& operator<< (std::ostream &os, const SDORuntimeException &except) +{ + return except.PrintSelf(os); +} // end ostream operator << + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDORuntimeException.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDORuntimeException.h new file mode 100644 index 0000000000..12036f0db1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDORuntimeException.h @@ -0,0 +1,517 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#if !defined SDO_EXCEPTIONS_H +#define SDO_EXCEPTIONS_H + +#include "commonj/sdo/export.h" + + +#include <string> +#include <iostream> + + + +/** SDORuntimeException - Exception base class. + * + * + * Description : + * ------------- + * SDO exception class definition + * + * This is intended as a base class. + * + * Parent Classes : + * ---------------- + * none + * + * Public Member functions: + * ------------------------ + * + * Constructors : + * SDORuntimeExceptionm(severity_level sev=severe, + * const string &msg_text=""); + * + * creates the exception object. Parameters are: + * sev: the severity of the exception (Error, Severe) + * msg_text: descriptive message_text + * + * copy constructor not necessary + * + * Destructor : + * virtual ~SDORuntimeException(); + * + * Assignment operator: + * not necessary + * + * void setSeverity(severity_level sev); + * set the exception severity + * + * void setMessageText(const char* msg_text); + * set the message text associated with the exception. (This text should + * come from a message catalog as it may be written to stdout/stderr at + * some point) + * + * void setExceptionLocation(const char* file, + * unsigned long line, + * const char* function=""); + * + * adds the location of the exception. Parameters + * file: the filename from where the exception is being created + * (from __FILE__) + * line: the line number from where the exception is being created + * (from __LINE__) + * function: The function name from where the exception is being created + * + * severity_level getSeverity() const; + * returns the severity of the exception + * + * const char* getMessageText() const; + * returns the message text that describes this exception. + * + * const tring& getFileName() const; + * returns the file name from the location information in the exception + * + * unsigned long getLineNumber() const; + * returns the line number from the location information in the exception + * + * const char* getFunctionName() const; + * returns the function name from the location information in the exception + * + * Private Data Members : + * ---------------------- + * severity_level severity; * Severity of exception + * string message_text; * Message associated with exception + * string file_name; * File name (from __FILE__) + * unsigned long line_number; * Line number (from __LINE__) + * string function_name; * Function name + * + */ + +class SDORuntimeException +{ + public: + // Constructor + enum severity_level + { + Normal, + Warning, + Error, + Severe + }; + + SDO_API SDORuntimeException(const char *name="SDORuntimeException", + severity_level sev=Severe, + const char* msg_text=""); + + SDO_API SDORuntimeException(const SDORuntimeException& c); + + // Destructor + virtual SDO_API ~SDORuntimeException(); + + /** getEClassName() get the exception class + * + * returns the name of the exception class, which will be + * a subclass of SDORuntimeException + */ + + SDO_API const char* getEClassName() const; + + /** getSeverity returns a level from severity_levels + * + * Return severity + * from the enumerator severity_levels, which is: + * + * Normal,Warning, Error,Severe + */ + + SDO_API severity_level getSeverity() const; + + /** + * Return message text associated with exception + */ + + SDO_API const char* getMessageText() const; + + /** getFileName() the file where the exception occurred + * + * Return file name where exception was raised + */ + + SDO_API const char* getFileName() const; + + /** getLineNumber gives the line where the excepion occurred + * + * Return line number where exception was raised + */ + + SDO_API unsigned long getLineNumber() const; + + /** getFunctionName give the name of the raising function + * + * Return function name where exception was raised + */ + + SDO_API const char* getFunctionName() const; + + + /** setSeverity + * + * sets an exception severity + */ + + SDO_API void setSeverity(severity_level sev); + + /** setMessageText + * + * set the message text associated with exception + */ + + SDO_API void setMessageText(const char* msg_text); + + + /** setExceptionLocation + * + * set exception location + */ + + SDO_API void setExceptionLocation(const char* file, + unsigned long line, + const char* function=""); + + SDO_API void setLocation(const char* file, + unsigned long line, + const char* function=""); + + SDO_API void trace(const char* text="%1:\n %3 %4 %2"); + + SDO_API virtual std::ostream& PrintSelf(std::ostream &os) const; + + /** operator << to write the exception + * + * ostream operator << + */ + + SDO_API friend std::ostream& operator<< (std::ostream &os, const SDORuntimeException &except); + + protected: + + private: + + char* class_name; + + severity_level severity; // Severity of exception + + char* message_text; // Description of exception + + //* Location where the exception was last thrown*handled + + class location + { + public: + char* file; //* File name (from __FILE__) + unsigned long line; //* Line number (from __LINE__) + char* function; //* Function name + }; + + // Array of locations + enum {num_locations=5}; + location locations[num_locations]; + + // Index into locations array + int location_set; + + +}; // End SDORuntimeException class definition + +/** + *************************************************************************** + * + * SDOOutOfMemoryException - Exception for no-storage + * + * *************************************************************************** + */ + +class SDOOutOfMemoryException: public SDORuntimeException +{ + public: + SDOOutOfMemoryException(unsigned long size) + : SDORuntimeException("SDOOutOfMemoryException", Severe, + "Unable to obtain storage of length " + size) + { + } + private: +}; // End SDOOutOfMemory class definition + +/** + *************************************************************************** + * + * SDONullPointerException - Exception for no-storage + * + * *************************************************************************** + */ + +class SDONullPointerException: public SDORuntimeException +{ + public: + SDONullPointerException(const char* param) + : SDORuntimeException("SDONullPointerException", Warning, + "The referenced object is null ") + { + } + private: +}; // End SDOOutOfMemory class definition +/** +*************************************************************************** +* +* SDOPathNotFoundException - Exception for bad path +* +**************************************************************************** +*/ +class SDOPathNotFoundException: public SDORuntimeException +{ + public: + SDOPathNotFoundException(const char* path) + : SDORuntimeException("SDOPathNotFoundException", Warning, + path) + { + } + private: +}; // End SDOPathNotFoundException class definition + +/** +*************************************************************************** +* +* SDOPropertyNotFoundException - Exception for property not found +* +**************************************************************************** +*/ + +class SDOPropertyNotFoundException: public SDORuntimeException +{ + public: + SDOPropertyNotFoundException(const char* name) + : SDORuntimeException("SDOPropertyNotFoundException", Warning, + name) + { + } + private: +}; // End SDOPropertyNotFoundException class definition + +/** +*************************************************************************** +* +* SDOTypeNotFoundException - Exception for type not found. +* +**************************************************************************** +*/ +class SDOTypeNotFoundException: public SDORuntimeException +{ + public: + SDOTypeNotFoundException(const char* name) + : SDORuntimeException("SDOTypeNotFoundException", Warning, + name) + { + } + private: +}; // End SDOTypeNotFoundException class definition + +/** +*************************************************************************** +* +* SDOFileNotFoundException - Exception for file not found +* +**************************************************************************** +*/ + +class SDOFileNotFoundException: public SDORuntimeException +{ + public: + SDOFileNotFoundException(const char* name) + : SDORuntimeException("SDOFileNotFoundException", Warning, + name) + { + } + private: +}; // End SDOFileNotFoundException class definition +/** +*************************************************************************** +* +* SDOPropertyNotSetException - Exception for asking for the value of an +* unset/undefaulted prop +* +**************************************************************************** +*/ +class SDOPropertyNotSetException: public SDORuntimeException +{ + public: + SDOPropertyNotSetException(const char* name) + : SDORuntimeException("SDOPropertyNotSetException", Warning, + name) + { + } + private: +}; // End SDOPropertyNotSetException class definition +/** +*************************************************************************** +* +* SDOUnsupportedOperationException - Invalid action or unimplemented method. +* +**************************************************************************** +*/ +class SDOUnsupportedOperationException: public SDORuntimeException +{ + public: + SDOUnsupportedOperationException(const char* name) + : SDORuntimeException("SDOUnsupportedOperationException", Warning, + name) + { + } + private: +}; // End SDOTypeNotFoundException class definition + +/** +*************************************************************************** +* +* SDOInvalidConversionException - Invalid conversion - cannot convert to type. +* +**************************************************************************** +*/ +class SDOInvalidConversionException: public SDORuntimeException +{ + public: + SDOInvalidConversionException(const char* name) + : SDORuntimeException("SDOInvalidConversionException", Warning, + name) + { + } + private: +}; // End SDOTypeNotFoundException class definition +/** +*************************************************************************** +* +* SDOIllegalArgumentException - Invalid argument passed (null name?). +* +**************************************************************************** +*/ +class SDOIllegalArgumentException: public SDORuntimeException +{ + public: + SDOIllegalArgumentException(const char* name) + : SDORuntimeException("SDOIllegalArgumentException", Warning, + name) + { + } + private: +}; // End SDOTypeNotFoundException class definition +/** +**************************************************************************** +* +* SDOIndexOutOfRangeException - element index not in a list. +* +**************************************************************************** +*/ +class SDOIndexOutOfRangeException: public SDORuntimeException +{ + public: + SDOIndexOutOfRangeException(const char* name) + : SDORuntimeException("SDOIndexOutOfRangeException", Warning, + name) + { + } + private: +}; // End SDOTypeNotFoundException class definition + +/** +*************************************************************************** +* +* SDOXMLParserException - XMLParser error +* +**************************************************************************** +*/ +class SDOXMLParserException: public SDORuntimeException +{ + public: + SDOXMLParserException(const char* name) + : SDORuntimeException("SDOXMLParserException", Warning, + name) + { + } + private: +}; // End SDOTypeNotFoundException class definition + +/* +*************************************************************************** +* +* Macro definitions +* +**************************************************************************** +*/ +/** + * ========================================================================= + * Macro - SDO_THROW_EXCEPTION + * + * adds the current file name, line number and function name to the exception. + * then throws the exception. + * The parameter 'function_name' should be the name of the function throwing + * this exception. + * The parameter 'type' is the class of exception to throw and must be a + * SDORuntimeException or a class derived from SDORuntimeException. + * The parameter 'parameter' is the construction parameter for the exception + * ========================================================================= +*/ + + #define SDO_THROW_EXCEPTION(function_name, type, parameter ) \ + {\ + type ex(parameter); \ + ex.setExceptionLocation(__FILE__,__LINE__,#function_name); \ + throw ex;\ + } + +/** + ========================================================================= + * Macro - SDO_RETHROW_EXCEPTION + * + * adds the current file name, line number and function name to the exception. + * then re-throws the exception. + * The parameter 'function_name' should be the name of the function throwing + * this exception. + * ========================================================================= +*/ + #define SDO_RETHROW_EXCEPTION(function_name, exception) \ + (exception).setLocation(__FILE__,__LINE__,#function_name); \ + throw; + +/** + * ========================================================================= + * Macro - SDO_HANDLE_EXCEPTION + * + * adds the current file name, line number and function name to the exception. + * Writes an exception trace entry then continues. + * The parameter 'function_name' should be the name of the function handling + * this exception. + * ========================================================================= +*/ + #define SDO_HANDLE_EXCEPTION(function_name, exception) \ + {\ + (exception).setLocation(__FILE__,__LINE__,#function_name); \ + (exception).Trace("Exception handled by %1: \n %3 %4 %2");\ + } + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSAX2Parser.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSAX2Parser.cpp new file mode 100644 index 0000000000..8240503337 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSAX2Parser.cpp @@ -0,0 +1,1476 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/20 14:24:42 $ */ + +#include "commonj/sdo/SDOSAX2Parser.h" + +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/XMLQName.h" +#include "commonj/sdo/DASProperty.h" +#include "commonj/sdo/Logging.h" +#include "commonj/sdo/DASType.h" +#include "commonj/sdo/XSDTypeInfo.h" +#include "commonj/sdo/TypeImpl.h" +#include "commonj/sdo/DataObjectImpl.h" +#include "commonj/sdo/DataFactoryImpl.h" +using namespace std; + +namespace commonj +{ + namespace sdo + { + + SDOSAX2Parser::SDOSAX2Parser( + DataFactoryPtr df, + const SDOXMLString& targetNamespace, + DataObjectPtr& rootDO, + ParserErrorSetter* insetter + ) + + : dataFactory(df), + targetNamespaceURI(targetNamespace), + rootDataObject(rootDO), + currentDataObject(0), + isDataGraph(false), + ignoreEvents(false), + dealingWithChangeSummary(false), + csbuilder(0), + SAX2Parser(insetter) + + + { + reset(); + if (targetNamespace.isNull()) + { + targetNamespaceURI = ""; + } + rootDataObject = 0; + newSequence = true; + } + + SDOSAX2Parser::~SDOSAX2Parser() + { + } + + void SDOSAX2Parser::reset() + { + rootDataObject = 0; + currentDataObject = 0; + isDataGraph = false; + ignoreEvents = false; + changeSummary = false; + IDMap.empty(); + IDRefs.empty(); + } + + + void SDOSAX2Parser::startDocument() + { + LOGINFO(INFO,"SDOSAX2Parser: startDocument"); + setNamespaces = true; + reset(); + } + + void SDOSAX2Parser::endDocument() + { + LOGENTRY(INFO,"SDOSAX2Parser: endDocument"); + // Iterate over IDREFs list and set references + ID_REFS::iterator refsIter; + for (refsIter = IDRefs.begin(); refsIter != IDRefs.end(); refsIter++) + { + try + { + const Type& type = refsIter->dataObject->getType(); + const Property& prop = refsIter->dataObject->getProperty(refsIter->property); + const Type& propType = ((TypeImpl&)type).getRealPropertyType(refsIter->property); + + // Allowing referenes to DataObjects only + if (!propType.isDataType()) + { + DataObjectPtr reffedDO; + ID_MAP::iterator idIter = IDMap.find(refsIter->value); + if (idIter != IDMap.end()) + { + reffedDO = idIter->second; + } + else + { + // assume it is an XPath? + + // Remove #/ from front of XPATH as getDataObject doeesnt + // support this yet - it does now + //SDOXMLString xpath(refsIter->value); + //if (xpath.firstIndexOf('#') == 0) + // xpath = xpath.substring(1); + //if (xpath.firstIndexOf('/') == 0) + // xpath = xpath.substring(1); + + reffedDO = rootDataObject->getDataObject(refsIter->value); + } + + if (!reffedDO) + { + continue; + } + + if (prop.isMany()) + { + DataObjectList& dol = refsIter->dataObject->getList(prop); + dol.append(reffedDO); + } + else + { + refsIter->dataObject->setDataObject(prop, reffedDO); + } + } + + } + catch (const SDORuntimeException&) + { + } + } + try { + // Now rebuild the changeSummary + if (csbuilder != 0) + { + csbuilder->buildChangeSummary(changeSummaryDO); + delete csbuilder; + csbuilder = 0; + } + } + catch (SDORuntimeException&) + { + } + + LOGEXIT(INFO,"SDOSAX2Parser: endDocument"); + } + + + bool SDOSAX2Parser::setDO(DataObjectPtr newDO, + SDOXMLString& propertyName) + { + LOGENTRY(INFO,"SDOSAX2Parser: setDO"); + + if (currentDataObject) + { + const Type& type = currentDataObject->getType(); + // go lower level so we can find open properties w/o exception + DataObject* dob = currentDataObject; + const PropertyImpl* pprop = ((DataObjectImpl*)dob)->getPropertyImpl(propertyName); + if (pprop == 0) + { + + LOGEXIT(INFO,"SDOSAX2Parser: setDO - exit1"); + return false; + } + + const Property& property = (Property&)*pprop; + //const Type& propertyType = ((TypeImpl&)type).getRealPropertyType(propertyName); + if (currentDataObject->getType().isSequencedType()) + { + SequencePtr seq = currentDataObject->getSequence(); + seq->addDataObject(property, newDO); + } + else + { + if (!property.isMany()) + { + currentDataObject->setDataObject(propertyName, newDO); + } + else + { + DataObjectList& dol = currentDataObject->getList(propertyName); + dol.append(newDO); + } + } + } + + setCurrentDataObject(newDO); + + LOGEXIT(INFO,"SDOSAX2Parser: setDO - exit2"); + return true; + } + + void SDOSAX2Parser::handleOpenAttribute( + SDOXMLString& tns, + const char* propuri, + const char* propname, + const char* value) + { + // first, see if there is a global element or attribute corresponding... + try + { + DataFactory* df = dataFactory; + const PropertyImpl* prop = 0; + const TypeImpl* ti = + ((DataFactoryImpl*)df)->findTypeImpl(propuri,"RootType"); + + if (ti != 0) + { + prop = (const PropertyImpl*)ti->getPropertyImpl(propname); + } + else + { + ti = ((DataFactoryImpl*)df)->findTypeImpl(tns,"RootType"); + } + + if (ti != 0) + { + prop = (const PropertyImpl*)ti->getPropertyImpl(propname); + } + + if (prop == 0) + { + // need to use the sequence interface if it exists + if (currentDataObject->getType().isSequencedType()) + { + SequencePtr seq = currentDataObject->getSequence(); + seq->addCString(propname, value); + } + else + { + currentDataObject->setCString(propname,value); + } + return; + } + + DataObject* dob = currentDataObject; + + switch (prop->getTypeEnum()) + { + case Type::BooleanType: + ((DataObjectImpl*)dob)->defineBoolean(propname); + break; + case Type::ByteType: + ((DataObjectImpl*)dob)->defineByte(propname); + break; + case Type::CharacterType: + ((DataObjectImpl*)dob)->defineCharacter(propname); + break; + case Type::BytesType: + ((DataObjectImpl*)dob)->defineBytes(propname); + break; + case Type::StringType: + ((DataObjectImpl*)dob)->defineString(propname); + break; + case Type::ShortType: + ((DataObjectImpl*)dob)->defineShort(propname); + break; + case Type::IntegerType: + ((DataObjectImpl*)dob)->defineInteger(propname); + break; + case Type::LongType: + ((DataObjectImpl*)dob)->defineLong(propname); + break; + case Type::DoubleType: + ((DataObjectImpl*)dob)->defineDouble(propname); + break; + case Type::FloatType: + ((DataObjectImpl*)dob)->defineFloat(propname); + break; + case Type::DateType: + ((DataObjectImpl*)dob)->defineDate(propname); + break; + } // switch + + // regardless of what type the property now is, we can set CString , and the + // right conversion will happen + + // need to use the sequence interface if it exists. + if (currentDataObject->getType().isSequencedType()) + { + SequencePtr seq = currentDataObject->getSequence(); + seq->addCString(propname, value); + } + else + { + currentDataObject->setCString(propname,value); + } + } + catch (SDORuntimeException) + { + } + return; + } + + + void SDOSAX2Parser::setAttributes( + SDOXMLString& tns, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + + LOGENTRY(INFO,"SDOSAX2Parser::setAttributes"); + + ////////////////////////////////////////////// + // The attributes are properties on the new DO + // Handle attributes + ////////////////////////////////////////////// + for (int i=0; i < attributes.size(); i++) + { + // Should ignore attributes like xsi:type + if (!(attributes[i].getUri().equalsIgnoreCase("http://www.w3.org/2001/XMLSchema-instance"))) + { + try + { + const SDOXMLString& propertyName = getSDOName(*currentDataObjectType, attributes[i].getName()); + DataObject* dob = currentDataObject; + const PropertyImpl* pprop = ((DataObjectImpl*)dob)->getPropertyImpl(propertyName); + if (pprop == 0 ) + { + if (currentDataObject->getType().isOpenType()) + { + // if its an open type, then attributes will be allowed to have + // an invalid name, and setCString will create them all as bytes + handleOpenAttribute(tns, (const char*)attributes[i].getUri(), + (const char*)attributes[i].getName(), + (const char*)attributes[i].getValue()); + + } + else + { + LOGERROR_1(WARNING,"SDOSAX2Parser: Property not found on closed type (ignored):%s", + (const char*)(attributes[i].getName())); + } + } + else + { + const Property& prop = (Property&)*pprop; + SDOXMLString propValue; + + XSDPropertyInfo* pi = (XSDPropertyInfo*)((DASProperty*)&prop)->getDASValue("XMLDAS::PropertyInfo"); + if (pi && pi->getPropertyDefinition().isQName) + { + XMLQName qname(attributes[i].getValue(), + documentNamespaces, namespaces); + propValue = qname.getSDOName(); + } + else + { + propValue = attributes[i].getValue(); + } + + if ((pi && pi->getPropertyDefinition().isIDREF) + || prop.isReference()) + { + // remember this value to resolve later + IDRef ref(currentDataObject, attributes[i].getName(), propValue); + IDRefs.insert(IDRefs.end(), ref); + } + else + { + if (pi && pi->getPropertyDefinition().isID) + { + // add this ID to the map + IDMap[propValue] = currentDataObject; + } + // Always set the property as a String. SDO will do the conversion + currentDataObject->setCString(attributes[i].getName(), propValue); + } + } + } + catch (const SDOPropertyNotFoundException&) + { + LOGERROR_1(WARNING,"SDOSAX2Parser: Error processing attribute (ignored):%s", + (const char*)(attributes[i].getName())); + } + } + } // End iterate over attributes + + LOGEXIT(INFO,"SDOSAX2Parser:setAttributes"); + + } + + + const PropertyImpl* SDOSAX2Parser::handleOpenType( + SDOXMLString& tns, + const SDOXMLString& localname, + DataObjectImpl* dob, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes, + SDOXMLString& xsitypeURI, + SDOXMLString& xsitypeName, + bool bToBeNull) + { + // first, see if there is a global element or attribute corresponding... + const PropertyImpl* pprop; + DataObjectPtr newDO = 0; + try + { + DataFactory* df = dataFactory; + const TypeImpl* ti = 0; + const PropertyImpl* prop = 0; + SDOXMLString propertyName; + + ti = ((DataFactoryImpl*)df)->findTypeImpl(tns,"RootType"); + if (ti != 0) + { + propertyName = getSDOName((Type&)*ti, localname); + prop = ti->getPropertyImpl(propertyName); + } + else + { + propertyName = localname; + } + + if (prop != 0) + { + if (prop->isMany()) + { + pprop = ((DataObjectImpl*)dob)->defineList(propertyName); + + // the type of the list needs to be set, as chars sets a CString + try + { + DataObjectList& dl = ((DataObjectImpl*)dob)->getList(propertyName); + ((DataObjectListImpl*)&dl)->setType(prop->getType().getURI(), + prop->getType().getName()); + } + catch (SDORuntimeException) + { + // let it pass - the type will be Bytes + } + + if (prop->getType().isDataType()) + { + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + } + else + { + newDO = dataFactory->create( + prop->getType().getURI(), + prop->getType().getName()); + // here we need to use the sequence interface if it exists. + if (dob->getType().isSequencedType()) + { + SequencePtr seq = currentPropertySetting.dataObject->getSequence(); + seq->addDataObject(propertyName,newDO); + } + else + { + DataObjectList& dol = dob->getList(propertyName); + dol.append(newDO); + } + setCurrentDataObject(newDO); + setAttributes(tns, namespaces,attributes); + } + return pprop; + } + else + { + switch (prop->getTypeEnum()) + { + case Type::BooleanType: + pprop = ((DataObjectImpl*)dob)->defineBoolean(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::ByteType: + pprop = ((DataObjectImpl*)dob)->defineByte(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::CharacterType: + pprop = ((DataObjectImpl*)dob)->defineCharacter(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::BytesType: + pprop = ((DataObjectImpl*)dob)->defineBytes(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::StringType: + pprop = ((DataObjectImpl*)dob)->defineString(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::ShortType: + pprop = ((DataObjectImpl*)dob)->defineShort(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::IntegerType: + pprop = ((DataObjectImpl*)dob)->defineInteger(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::LongType: + pprop = ((DataObjectImpl*)dob)->defineLong(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::DoubleType: + pprop = ((DataObjectImpl*)dob)->defineDouble(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::FloatType: + pprop = ((DataObjectImpl*)dob)->defineFloat(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::DateType: + pprop = ((DataObjectImpl*)dob)->defineDate(propertyName); + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + break; + case Type::DataObjectType: + pprop = ((DataObjectImpl*)dob)->defineDataObject(propertyName, + prop->getType().getURI(), prop->getType().getName()); + newDO = dataFactory->create( + prop->getType().getURI(), + prop->getType().getName()); + // here we need to use the sequence interface if it exists. + if (dob->getType().isSequencedType()) + { + SequencePtr seq = dob->getSequence(); + seq->addDataObject(propertyName, newDO); + } + else + { + dob->setDataObject(propertyName, newDO); + } + setCurrentDataObject(newDO); + setAttributes(tns,namespaces,attributes); + break; + } + } // else + } // if prop != 0 + else + { + // The type is open, and the property doesnt exist, so we are creating + // a property, and need to find out the type to create. + // As I cannot tell if its a single value or many valued, I create all + // as many valued + // could be data object or primitive. All primitives will appear + // as bytes. + // UPDATE: Spec says that all elements will appear as DataObjects which + // are sequenced - the text will come out as text elements in the sequence + + if (!xsitypeName.isNull()) + { + // it has a type from xsi:type + newDO = dataFactory->create(xsitypeURI, xsitypeName); + } + else + { + newDO = dataFactory->create(Type::SDOTypeNamespaceURI, "OpenDataObject"); + } + pprop = ((DataObjectImpl*)dob)->defineList(propertyName); + // here we need to use the sequence interface if it exists. + if (dob->getType().isSequencedType()) + { + SequencePtr seq = dob->getSequence(); + seq->addDataObject(propertyName, newDO); + } + else + { + DataObjectList& dol = dob->getList(propertyName); + dol.append(newDO); + } + setCurrentDataObject(newDO); + setAttributes(tns,namespaces,attributes); + } + return pprop; + } + catch (SDORuntimeException) + { + // fail to find the property or create a dummy + return 0; + } + } + + void SDOSAX2Parser::startElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + + { + LOGENTRY(INFO,"SDOSAX2Parser: startElementNs"); + + LOGINFO_1(INFO,"SDOSAX2Parser: startElementNs:%s", + (const char*)localname); + + newSequence = true; + + bool bToBeNull = false; + // Save the namespace information from the first element + if (setNamespaces) + { + documentNamespaces = namespaces; + setNamespaces = false; + } + + if (ignoreEvents) + { + // Check for the tag we are waiting for + if ( (ignoreTag.localname.equals(localname)) + && (ignoreTag.uri.equals(URI)) + && (ignoreTag.prefix.equals(prefix)) ) + { + ignoreTag.tagCount++; + } + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit1"); + return; + } + + if (URI.equalsIgnoreCase("http://www.w3.org/2001/XMLSchema")) + { + // ignore anything within a schema + LOGINFO_1(INFO,"SDOSAX2Parser ignores schema element:%s", + (const char *)localname); + + // We need to ignore all events until the end tag for this element + ignoreEvents = true; + ignoreTag.localname = localname; + ignoreTag.uri = URI; + ignoreTag.prefix = prefix; + ignoreTag.tagCount = 0; + return; + } + + + + if (dealingWithChangeSummary) + { + if (csbuilder == 0) + { + LOGERROR(ERROR,"SDOSAX2Parser:Parser builds summary with no builder"); + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit2"); + return; + } + csbuilder->processStart( + localname, + prefix, + URI, + namespaces, + attributes); + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit3"); + return; + } + + + if (URI.equalsIgnoreCase(Type::SDOTypeNamespaceURI.c_str())) + { + /////////////////////////////////////////////////////////////////////// + // Handle datagraph + /////////////////////////////////////////////////////////////////////// + if (localname.equalsIgnoreCase("datagraph")) + { + // Remember this is a datagraph. The root DO will be created + // later when we can have a better guess at the namespaceURI + isDataGraph = true; + } // end handling sdo:datagraph + + //////////////////////////////////// + // Handle ChangeSummary on datagraph + //////////////////////////////////// + if (localname.equals("changeSummary")) + { + changeSummary = true; + changeSummaryDO = currentDataObject; + + csbuilder = new ChangeSummaryBuilder( + dataFactory, rootDataObject ); + + changeSummaryLogging = true; + + + SDOXMLString logging = attributes.getValue("logging"); + if (!logging.isNull()) + { + if (logging.equals("false")) + { + changeSummaryLogging = false; + } + } + + LOGINFO(INFO,"SDOSAX2Parser:Start change summary"); + dealingWithChangeSummary = true; + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit4"); + return; + + } + + } + else + { + /////////////////////////////////////////////////////////////////////// + // Each element is a DataObject or a Property on the current DO + /////////////////////////////////////////////////////////////////////// + DataObjectPtr newDO = 0; + + SDOXMLString typeURI, typeName, propertyName; + + /////////////////////////////////////////////////////////////////////// + // Determine the type. It is either specified by the xsi:type attribute + // or the localname is the name of a property on "RootType" + /////////////////////////////////////////////////////////////////////// + int i; + for (i=0; i < attributes.size(); i++) + { + if (attributes[i].getUri().equalsIgnoreCase("http://www.w3.org/2001/XMLSchema-instance")) + { + if (attributes[i].getName().equalsIgnoreCase("type")) + { + SDOXMLString fullTypeName = attributes[i].getValue(); + SDOXMLString pref; + + int index = fullTypeName.firstIndexOf(':'); + if (index < 0) + { + typeName = fullTypeName; + } + else + { + // Is the namespace prefix defined? + typeName = fullTypeName.substring(index+1); + pref = fullTypeName.substring(0, index); + } + + // Convert the prefix to a namespace URI + const SDOXMLString* namespaceURI = namespaces.find(pref); + if (namespaceURI == 0) + { + namespaceURI = documentNamespaces.find(pref); + } + if (namespaceURI != 0) + { + typeURI = *namespaceURI; + } + } + else if (attributes[i].getName().equalsIgnoreCase("nil")) + { + if (attributes[i].getValue().equalsIgnoreCase("true")) + { + // the current setting needs to be setNull + bToBeNull = true; + } + } + } + } // End - attribute loop + + if (typeURI.isNull()) + { + typeURI = ""; + } + + SDOXMLString tns = URI; + + try + { + if (currentDataObject == 0) + { + // This element should become the root data object + + // Target namespace will be: + // the targetNamespaceURI if specified + // or the URI of xsi:type if specified + // or the URI of this element + if (!typeURI.equals("")) + { + tns = typeURI; + } + + if (!targetNamespaceURI.isNull() && !targetNamespaceURI.equals("")) + { + tns = targetNamespaceURI; + } + + // Check for localname as a property of the RootType + // if we do not already know the type + if (typeName.isNull()) + { + const Type& rootType = dataFactory->getType(tns, "RootType"); + propertyName = getSDOName(rootType, localname); + const Type& newType = + ((TypeImpl&)(rootType)).getRealPropertyType(propertyName); + + typeURI = newType.getURI(); + typeName = newType.getName(); + } + + // Create the root DataObject + if (isDataGraph) + { + DataObjectPtr rootdo = dataFactory->create(tns, "RootType"); + setCurrentDataObject(rootdo); + changeSummaryDO = currentDataObject; + } + else + { + DataFactory* df = dataFactory; + ((DataFactoryImpl*)df)->setRootElementName(localname); + } + + // NOTE: always creating DO doesn't cater for DataType as top element + + const Type& tp = dataFactory->getType(typeURI,typeName); + if (tp.isDataType()) + { + newDO = dataFactory->create(tns, "RootType"); + currentPropertySetting = PropertySetting(newDO, localname, + bToBeNull); + + // TODO - need instead to record the fact that its a primitive, not + // a real DO - and then present it as the root. + // newDO = dataFactory->create(tns, "RootType"); + // const Type& tpr = dataFactory->getType(tns,"RootType"); + // XSDTypeInfo* typeInfo = (XSDTypeInfo*) + // ((DASType*)&tpr)->getDASValue("XMLDAS::TypeInfo"); + // if (typeInfo) + // { + // TypeDefinitionImpl* td; + // td = (TypeDefinitionImpl*)&(typeInfo->getTypeDefinition()); + // if (td)td->isExtendedPrimitive = true; + // currentPropertySetting = PropertySetting(newDO, "value" /*localname*/, + // bToBeNull); + + // } + // else + // { + // currentPropertySetting = PropertySetting(newDO, localname, + // bToBeNull); + // } + + } + else + { + + newDO = dataFactory->create(typeURI, typeName); + + // get the type definition, and see if its an extended primitive. + + XSDTypeInfo* typeInfo = (XSDTypeInfo*) + ((DASType*)&tp)->getDASValue("XMLDAS::TypeInfo"); + if (typeInfo) + { + const TypeDefinitionImpl& typeDefinition = typeInfo->getTypeDefinition(); + if (typeDefinition.isExtendedPrimitive) + { + // The name of this element is the name of a property on the current DO + currentPropertySetting = PropertySetting(newDO, localname, + bToBeNull); + } + } + } + + } // End - currentDataObject == 0 + + else + { // currentDataObject != 0 + + // Get the Property from the dataObject + propertyName = getSDOName(*currentDataObjectType, localname); + const Type& type = currentDataObject->getType(); + + + // go lower level so we can find open properties w/o exception + DataObject* dob = currentDataObject; + const PropertyImpl* pprop = ((DataObjectImpl*)dob)->getPropertyImpl(propertyName); + if (pprop == 0) + { + if (type.isOpenType()) + { + pprop = handleOpenType( + tns, + localname, + (DataObjectImpl*)dob, + namespaces, + attributes, + typeURI, + typeName, + bToBeNull); + } + if (pprop == 0) + { + // this is an open property , we will need to create it + LOGERROR_1(WARNING,"SDOSAX2Parser Unknown element:%s", + (const char *)localname); + + // We need to ignore all events until the end tag for this element + ignoreEvents = true; + ignoreTag.localname = localname; + ignoreTag.uri = URI; + ignoreTag.prefix = prefix; + ignoreTag.tagCount = 0; + if (setter != 0) + { + char *msg = new char[strlen((const char*)localname) + 32]; + if (msg) { + sprintf(msg,"Parser found unknown element %s", + (const char*)localname); + setter->setError( msg ); + delete msg; + } + } + } + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit5"); + return; + } + else + { + + const Property& prop = (Property&)*pprop; + const TypeImpl* propType = ((TypeImpl&)type).getRealPropertyTypeImpl(propertyName); + if (propType == 0) + { + // could be a previously created open type property + propType = (const TypeImpl*)pprop->getTypeImpl(); + } + if (propType != 0) + { + XSDPropertyInfo* pi = (XSDPropertyInfo*)((DASProperty*)&prop)->getDASValue("XMLDAS::PropertyInfo"); + if ((pi && pi->getPropertyDefinition().isIDREF) + || prop.isReference()) + { + // The name of this element is the name of a property on the current DO + currentPropertySetting = PropertySetting(currentDataObject, propertyName, bToBeNull, + true); + } + + // If it is a DataType then we need set the value + else if (propType->isDataType() ) + { + // The name of this element is the name of a property on the current DO + currentPropertySetting = PropertySetting(currentDataObject, propertyName, + bToBeNull); + } + else + { + + // If typeName is not set then create object of Type of Property + // otherwise use the typeURI and typeName specified by e.g. xsi:type + if (typeName.isNull()) + { + newDO = dataFactory->create(propType->getURI(), propType->getName()); + } + else + { + newDO = dataFactory->create(typeURI, typeName); + } + + XSDTypeInfo* typeInfo = (XSDTypeInfo*) + ((DASType*)propType)->getDASValue("XMLDAS::TypeInfo"); + if (typeInfo && typeInfo->getTypeDefinition().isExtendedPrimitive) + { + // The name of this element is the name of a property on the current DO + currentPropertySetting = PropertySetting(newDO, "value", bToBeNull); + } + + } + } + } // End // currentDataObject != 0 + } // end prop != 0 + if (newDO) + { + if (!setDO(newDO, propertyName)) + { + LOGERROR_1(WARNING,"SDOSAX2Parser Unknown element:%s", + (const char *)localname); + + // We need to ignore all events until the end tag for this element + ignoreEvents = true; + ignoreTag.localname = localname; + ignoreTag.uri = URI; + ignoreTag.prefix = prefix; + ignoreTag.tagCount = 0; + if (setter != 0) + { + char *msg = new char[strlen((const char*)localname) + 32]; + if (msg) { + sprintf(msg,"Parser found unknown element %s", + (const char*)localname); + setter->setError( msg ); + delete msg; + } + } + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit6"); + return; + } + } + } // end try + + catch (const SDOTypeNotFoundException& ) + { + + LOGERROR_1(WARNING,"SDOSAX2Parser Unknown element:%s", + (const char *)localname); + + // We need to ignore all events until the end tag for this element + ignoreEvents = true; + ignoreTag.localname = localname; + ignoreTag.uri = URI; + ignoreTag.prefix = prefix; + ignoreTag.tagCount = 0; + if (setter != 0) + { + char *msg = new char[strlen((const char*)localname) + 32]; + if (msg) { + sprintf(msg,"Parser found unknown element %s", + (const char*)localname); + setter->setError( msg ); + delete msg; + } + } + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit7"); + return; + } + +#ifdef _DEBUG + catch (const SDOPropertyNotFoundException& e ) +#else + catch (const SDOPropertyNotFoundException& ) +#endif + { + LOGERROR_1(WARNING,"SDOSAX2Parser Unknown element exception:%s", + (const char *)localname); + LOGSDOEXCEPTION(WARNING,"Exception:",e); + + // We need to ignore all events until the end tag for this element + ignoreEvents = true; + ignoreTag.localname = localname; + ignoreTag.uri = URI; + ignoreTag.prefix = prefix; + ignoreTag.tagCount = 0; + if (setter != 0) + { + char *msg = new char[strlen((const char*)localname) + 32]; + if (msg) + { + sprintf(msg,"Parser found unknown element %s", + (const char*)localname); + setter->setError( msg ); + delete msg; + } + } + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit8"); + return; + } + + setAttributes(tns,namespaces, attributes); + + } + LOGEXIT(INFO,"SDOSAX2Parser: startElementNs - exit9"); + } + + + void SDOSAX2Parser::endElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI) + { + + LOGENTRY(INFO,"SDOSAX2Parser: endElementNs"); + + newSequence = true; + + if (localname.equals("changeSummary")) + { + // end of change summary + dealingWithChangeSummary = false; + LOGINFO(INFO,"SDOSAX2Parser: Finished change summary"); + LOGEXIT(INFO,"SDOSAX2Parser: endElementNs - exit1"); + return; + } + + if (dealingWithChangeSummary) + + { + if (csbuilder == 0) + { + LOGERROR(WARNING,"SDOSAX2Parser: End change summary with no builder"); + LOGEXIT(INFO,"SDOSAX2Parser: endElementNs - exit2"); + return; + } + csbuilder->processEnd(localname, + prefix, + URI); + LOGEXIT(INFO,"SDOSAX2Parser: endElementNs - exit3"); + return; + } + + + if (ignoreEvents) + { + // Check for the tag we are waiting for + if ( (ignoreTag.localname.equals(localname)) + && (ignoreTag.uri.equals(URI)) + && (ignoreTag.prefix.equals(prefix)) ) + { + if (ignoreTag.tagCount == 0) + { + ignoreEvents = false; + } + ignoreTag.tagCount--; + } + LOGEXIT(INFO,"SDOSAX2Parser: endElementNs - exit4"); + return; + } + + // If currentPropertySetting is set (name is not null) + // then we need to set the property now + if (!currentPropertySetting.name.isNull()) + { + if (currentPropertySetting.isNULL) + { + + currentPropertySetting.dataObject-> + setNull((const char*)currentPropertySetting.name); + + } + else + { + if (currentPropertySetting.value.isNull()) + { + currentPropertySetting.value = SDOXMLString(""); + } + try + { + const Type& tp = currentPropertySetting.dataObject->getType(); + XSDTypeInfo* typeInfo = (XSDTypeInfo*) + ((DASType*)&tp)->getDASValue("XMLDAS::TypeInfo"); + if (typeInfo && typeInfo->getTypeDefinition().isExtendedPrimitive) + { + const Property& p = currentPropertySetting.dataObject->getProperty( + "value"); + if (p.isMany()) + { + // use the sequence interface if it exists. + if (currentPropertySetting.dataObject->getType().isSequencedType()) + { + SequencePtr seq = currentPropertySetting.dataObject->getSequence(); + seq->addCString("value", currentPropertySetting.value); + } + else + { + DataObjectList& dl = currentPropertySetting.dataObject-> + getList((const char*)"value"); + dl.append((const char*)currentPropertySetting.value); + } + + } + else + { + // use the sequence interface if it exists + if (currentPropertySetting.dataObject->getType().isSequencedType()) + { + SequencePtr seq = currentPropertySetting.dataObject->getSequence(); + seq->addCString("value", currentPropertySetting.value); + } + else + { + currentPropertySetting.dataObject-> + setCString((const char*)"value", currentPropertySetting.value ); + } + } + if (dataObjectStack.size() == 0 || rootDataObject == dataObjectStack.top()) + { + currentDataObject = 0; + currentDataObjectType = 0; + } + else + { + dataObjectStack.pop(); + currentDataObject = dataObjectStack.top(); + currentDataObjectType = &(currentDataObject->getType()); + } + + } + else + { + if (currentPropertySetting.isIDREF) + { + // remember this value to resolve later + IDRef ref(currentPropertySetting.dataObject, + currentPropertySetting.name, + currentPropertySetting.value ); + IDRefs.insert(IDRefs.end(), ref); + } + else + { + if (currentPropertySetting.dataObject->getType().isSequencedType()) + { + SequencePtr seq = currentPropertySetting.dataObject->getSequence(); + seq->addCString(currentPropertySetting.name, currentPropertySetting.value); + } + // Always set the property as a String. SDO will do the conversion + + // It might be a single setting for a many-valued property. + // may throw SDOPropertyNotFoundException + else { + const Property& p = currentPropertySetting.dataObject->getProperty( + currentPropertySetting.name); + if (p.isMany()) + { + DataObjectList& dl = currentPropertySetting.dataObject-> + getList((const char*)currentPropertySetting.name); + dl.append((const char*)currentPropertySetting.value); + } + else + { + currentPropertySetting.dataObject-> + setCString((const char*)currentPropertySetting.name, currentPropertySetting.value ); + } + } + } + } + } +#ifdef _DEBUG + catch (const SDOPropertyNotFoundException& e) +#else + catch (const SDOPropertyNotFoundException&) +#endif + { + LOGSDOEXCEPTION(WARNING,"SDOSAX2Parser error attribute (ignored)",e); + } + } + currentPropertySetting = PropertySetting(); + + } + else + { + if (changeSummary + && changeSummaryLogging + && changeSummaryDO == currentDataObject) + { + // Set logging on for this DO before it is popped from stack + ChangeSummary* cs = currentDataObject->getChangeSummary(); + if (cs) + { + cs->beginLogging(); + } + changeSummary = false; + } + + if (dataObjectStack.size() == 0 || rootDataObject == dataObjectStack.top()) + { + currentDataObject = 0; + currentDataObjectType = 0; + } + else + { + dataObjectStack.pop(); + currentDataObject = dataObjectStack.top(); + currentDataObjectType = &(currentDataObject->getType()); + } + } + LOGEXIT(INFO,"SDOSAX2Parser: endElementNs - exit4"); + } + + + + void SDOSAX2Parser::characters(const SDOXMLString& chars) + { + if (chars.isNull()) return; + + if (!strcmp((const char*)chars,"\r") || + !strcmp((const char*)chars,"\n")) + { + newSequence = true; + return; + } + + if (dealingWithChangeSummary) + { + if (csbuilder == 0) + { + LOGERROR(WARNING,"SDOSAX2Parser: no builder"); + return; + } + csbuilder->processChars(chars); + return; + } + + if (ignoreEvents) + return; + + if (!currentPropertySetting.name.isNull()) + { + currentPropertySetting.value = currentPropertySetting.value + chars; + return; + } + DataObject* dob = currentDataObject; + if ((dob != 0) && ((DataObjectImpl*)dob)->getTypeImpl().isFromList()) + { + // this is a list,so we need to split it up + DataObjectList& dl = currentDataObject->getList( + (const char *)"values"); + + const char* str = (const char*)chars; + char* buf = new char[strlen(str)+1]; + if (!buf) return; + + strcpy(buf,str); + + int start_point = 0; + int end_point; + int final = strlen(buf); + + do { + if (start_point >= final)break; + while (buf[start_point] == (char)0x20 || buf[start_point] == (char)0x09 + || buf[start_point] == (char)0x0A || buf[start_point] == (char)0x0D )start_point++; + end_point = start_point; + while (buf[end_point] != (char)0x20 && buf[end_point] != (char)0x09 && + buf[end_point] != (char)0x0A && buf[end_point] != (char)0x0D && + buf[end_point] != 0x0)end_point++; + if (end_point == start_point)break; + *(buf+end_point) = 0; + dl.append((const char*)(buf+start_point)); + start_point = end_point + 1; + } while(1); + + delete buf; + return; + } + + + // If the current DataObject is a sequenced Type + // then add this as text to the sequence + if (currentDataObject && currentDataObjectType->isSequencedType()) + { + SequencePtr seq = currentDataObject->getSequence(); + if (seq) + { + if (newSequence == true) + { + seq->addText(chars); + newSequence = false; + } + else + { + for (int k= (int)(seq->size())-1; k>=0 ; k --) + { + if (seq->isText(k)) + { + const char * s = seq->getCStringValue(k); + + if (s) + { + char *combi = + new char[strlen(s)+strlen(chars) + 2]; + strcpy(combi,s); + strcat(combi,chars); + seq->setText(k,(const char*)combi); + delete combi; + } + else + { + seq->setText(k,chars); + } + return; + } + } + seq->addText(chars); + } + return; + } + } + + } + + + void SDOSAX2Parser::setCurrentDataObject(DataObjectPtr currentDO) + { + currentDataObject = currentDO; + dataObjectStack.push(currentDataObject); + currentDataObjectType = &(currentDataObject->getType()); + if (rootDataObject == 0) + { + rootDataObject = currentDataObject; + } + } + + const SDOXMLString& SDOSAX2Parser::getSDOName(const Type& type, const SDOXMLString& localName) + { + +/* XSDTypeInfo* typeInfo = (XSDTypeInfo*)((DASType*)&type)->getDASValue("XMLDAS::TypeInfo"); + if (typeInfo) + { + const TypeDefinitionImpl& typeDefinition = typeInfo->getTypeDefinition(); + XmlDasPropertyDefs::const_iterator propsIter; + for (propsIter = typeDefinition.properties.begin(); propsIter != typeDefinition.properties.end(); propsIter++) + { + const PropertyDefinitionImpl& prop = *propsIter; + if (prop.localname.equals(localName)) + { + return prop.name; + } + for (int i=0;i< prop.substituteNames.size();i++) + { + if (prop.substituteLocalNames[i].equals(localName)) + { + return prop.substituteNames[i]; + // possibly should be return prop.name; + } + } + } + } + */ + + PropertyList pl = type.getProperties(); + for (int i = 0; i < pl.size(); i++) + { + XSDPropertyInfo* pi = (XSDPropertyInfo*)((DASProperty*)&pl[i])->getDASValue("XMLDAS::PropertyInfo"); + if (pi) + { + const PropertyDefinitionImpl& propdef = pi->getPropertyDefinition(); + if (localName .equals(propdef.localname)) + return propdef.name; + + for (int j=0;j< propdef.substituteNames.size();j++) + { + if (propdef.substituteLocalNames[j].equals(localName)) + { + return propdef.substituteNames[j]; + // possibly should be return propdef.name; + } + } + } + } + + + + return localName; + } + + + std::istream& operator>>(std::istream& input, SDOSAX2Parser& parser) + { + parser.stream(input); + + return input; + } + + std::istringstream& operator>>(std::istringstream& input, SDOSAX2Parser& parser) + { + parser.stream(input); + + return input; + } + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSAX2Parser.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSAX2Parser.h new file mode 100644 index 0000000000..4a985a8c02 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSAX2Parser.h @@ -0,0 +1,170 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SDOSAX2PARSER_H_ +#define _SDOSAX2PARSER_H_ +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SAX2Parser.h" + +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/PropertySetting.h" +#include "commonj/sdo/ChangeSummaryImpl.h" +#include "commonj/sdo/ChangeSummaryBuilder.h" + + +#include <stack> + +namespace commonj +{ + namespace sdo + { + + +/** + * SDOSAX2Parser implements SAX2Parser. + * This class gets called back by the libxml library, and + * deals with the creation of data objects from XML. + */ + + class SDOSAX2Parser : public SAX2Parser + { + + + public: + + + SDOSAX2Parser( + DataFactoryPtr df, + const SDOXMLString& targetNamespaceURI, + DataObjectPtr& rootDO, + ParserErrorSetter* insetter); + + virtual ~SDOSAX2Parser(); + + virtual void startDocument(); + virtual void endDocument(); + + virtual bool setDO(DataObjectPtr newDO, + SDOXMLString& propertyName); + + virtual void setAttributes( + SDOXMLString& tns, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void handleOpenAttribute( + SDOXMLString& tns, + const char* propuri, + const char* propname, + const char* value); + + virtual const PropertyImpl* handleOpenType( + SDOXMLString& tns, + const SDOXMLString& localname, + DataObjectImpl* dob, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes, + SDOXMLString& xsitypeURI, + SDOXMLString& xsitypeName, + bool bToBeNull); + + virtual void startElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void endElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI); + + virtual void characters(const SDOXMLString& chars); + + friend std::istream& operator>>(std::istream& input, SDOSAX2Parser& parser); + friend std::istringstream& operator>>(std::istringstream& input, SDOSAX2Parser& parser); + + + private: + SDOXMLString targetNamespaceURI; + DataFactoryPtr dataFactory; + DataObjectPtr& rootDataObject; + + + std::stack<DataObjectPtr> dataObjectStack; + + DataObjectPtr currentDataObject; + bool isDataGraph; + bool newSequence; + + void setCurrentDataObject(DataObjectPtr currentDO); + const Type* currentDataObjectType; + const SDOXMLString& getSDOName(const Type& type, const SDOXMLString& localName); + + PropertySetting currentPropertySetting; + + void reset(); + + bool setNamespaces; + SAX2Namespaces documentNamespaces; + + bool changeSummary; + DataObjectPtr changeSummaryDO; + bool changeSummaryLogging; + bool dealingWithChangeSummary; + ChangeSummaryBuilder* csbuilder; + + bool ignoreEvents; + struct ignoretag + { + SDOXMLString localname; + SDOXMLString uri; + SDOXMLString prefix; + int tagCount; + } ignoreTag; + + + typedef std::map<SDOXMLString, DataObjectPtr> ID_MAP; + ID_MAP IDMap; + + class IDRef + { + public: + IDRef(DataObjectPtr dataobj, + const SDOXMLString& prop, + const SDOXMLString& val) + : dataObject(dataobj), property(prop), value(val) + {} + + DataObjectPtr dataObject; + SDOXMLString property; + SDOXMLString value; + }; + + typedef std::list<IDRef> ID_REFS; + ID_REFS IDRefs; + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif //_SDOSAX2PARSER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSPI.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSPI.h new file mode 100644 index 0000000000..1165514123 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSPI.h @@ -0,0 +1,25 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SDO.h" + +#include "commonj/sdo/DASValues.h" diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp new file mode 100644 index 0000000000..c9476ca867 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp @@ -0,0 +1,1337 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ +#include "libxml/uri.h" +#include "commonj/sdo/SDOSchemaSAX2Parser.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/XSDTypeInfo.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/Logging.h" +#include "commonj/sdo/SDOUtils.h" + + +#include <stdio.h> + +extern "C" { + void sdo_error(void *ctx, const char *msg, ...); +} + +namespace commonj +{ + namespace sdo + { + + SDOSchemaSAX2Parser::SDOSchemaSAX2Parser(SchemaInfo& schemaInf, + ParserErrorSetter* insetter) + : schemaInfo(schemaInf) ,SAX2Parser(insetter) + { + bInSchema = false; + bInvalidElement = false; + bInInvalidContent = false; + bInvalidList = false; + inGroup = 0; + preParsing = true; + } + + SDOSchemaSAX2Parser::~SDOSchemaSAX2Parser() + { + } + + + void SDOSchemaSAX2Parser::storeStartElementEvent( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + // copy the event to as list for replay. + if (currentGroup) + { + currentGroup->events.insert( currentGroup->events.end(), + GroupEvent( + localname,prefix,URI,namespaces,attributes)); + } + + } + + void SDOSchemaSAX2Parser::storeEndElementEvent( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI) + { + // copy the event to as list for replay. + if (currentGroup) + { + currentGroup->events.insert(currentGroup->events.end(), + GroupEvent(localname,prefix,URI)); + } + + } + + void SDOSchemaSAX2Parser::replayEvents( + const SDOXMLString& uri, + const SDOXMLString& name, + bool isGroup) + { + for (int i=0;i< groupList.size(); i++) + { + if (groupList[i].isAttributeGroup != isGroup) + { + if ( + (!name.isNull() && name.equals(groupList[i].name)) + && + ( + (uri.isNull() && groupList[i].uri.isNull()) + || uri.equals(groupList[i].uri)) + ) + { + for (int j=0;j< groupList[i].events.size();j++) + { + if (groupList[i].events[j].isStartEvent) + { + startElementNs( + (const SDOXMLString&) + groupList[i].events[j].localname, + (const SDOXMLString&) + groupList[i].events[j].prefix, + (const SDOXMLString&) + groupList[i].events[j].URI, + (const SAX2Namespaces&) + groupList[i].events[j].namespaces, + (const SAX2Attributes&) + groupList[i].events[j].attributes); + } + else + { + endElementNs( + (const SDOXMLString&) + groupList[i].events[j].localname, + (const SDOXMLString&) + groupList[i].events[j].prefix, + (const SDOXMLString&) + groupList[i].events[j].URI); + } + } + return; + } + } + } + // no group found + if (setter) + { + char *msg = new char[strlen((const char*)name) + 32]; + if (msg) + { + sprintf(msg,"Use of undefined group %s", + (const char*)name); + setter->setError( msg ); + delete msg; + } + } + } + + // ============================================================================ + // endDocument + // ============================================================================ + void SDOSchemaSAX2Parser::endDocument() + { + preParsing=!preParsing; + schemaInfo.getSchemaNamespaces().empty(); + } + + + // ============================================================================ + // startElementNS + // ============================================================================ + void SDOSchemaSAX2Parser::startElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startElementNs:%s",(const char*)localname); + + if (URI.equalsIgnoreCase("http://www.w3.org/2001/XMLSchema")) + { + + /////////////////////////////////////////////////////////////////////// + // Handle schema + // Set the URI from the targetNamespace of the xsd:schema element + // Remember namespace mappings + // Create the root Type + /////////////////////////////////////////////////////////////////////// + + + if (localname.equalsIgnoreCase("schema")) + { + bInSchema = true; + // Handle namespace definitions + + + schemaInfo.getSchemaNamespaces().merge(namespaces); + + // Handle attributes + for (int i=0; i < attributes.size(); i++) + { + if (attributes[i].getName().equalsIgnoreCase("targetNamespace")) + { + schemaInfo.setTargetNamespaceURI(attributes[i].getValue()); + } + } + + + currentType.uri = schemaInfo.getTargetNamespaceURI(); + currentType.name = "RootType"; + currentType.localname="RootType"; + return; + + } // end schema handling + if (preParsing) + { + // we are now pre-parsing groups so that we can allow them to be + // defined after use. + + if (inGroup > 0) + { + if ( localname.equalsIgnoreCase("group") + || localname.equalsIgnoreCase("attributeGroup")) + { + inGroup++; + } + // check for a group reference first + // we are inside a group.... + storeStartElementEvent( + localname, + prefix, + URI, + namespaces, + attributes); + return; + } + + if ( localname.equalsIgnoreCase("group") + || localname.equalsIgnoreCase("attributeGroup")) + { + inGroup++; + int i; + for (i=0; i < attributes.size(); i++) + { + if (attributes[i].getName().equalsIgnoreCase("ref")) + { + // dont store references. + return; + } + } + + groupList.insert(groupList.begin(),GroupDefinition()); + currentGroup = &groupList[0]; + + if (localname.equalsIgnoreCase("group")) + currentGroup->isAttributeGroup = false; + else currentGroup->isAttributeGroup = true; + + for (i=0; i < attributes.size(); i++) + { + if (attributes[i].getName().equalsIgnoreCase("name")) + { + currentGroup->uri = schemaInfo.getTargetNamespaceURI(); + currentGroup->name = attributes[i].getValue(); + } + } + } + } // end of preParsing groups. + else + { + if (inGroup == 0) + { + // Handle <import> of other schema + if (localname.equalsIgnoreCase("import")) + { + // TODO - import and include treated equally for now - need to + // separate out the namespace info for import + startInclude(localname, prefix, URI, namespaces, attributes); + } + + // Handle <include> of other schema + else if (localname.equalsIgnoreCase("include")) + { + startInclude(localname, prefix, URI, namespaces, attributes); + } + + /////////////////////////////////////////////////////////////////////// + // Handle elements and attributes + // These become Properties of the current Type + // ?? Any special handling of global elements??? + /////////////////////////////////////////////////////////////////////// + else if (localname.equalsIgnoreCase("element")) + { + if (!bInInvalidContent) startElement(localname, prefix, URI, namespaces, attributes); + } + else if (localname.equalsIgnoreCase("attribute")) + { + if (!bInInvalidContent) startAttribute(localname, prefix, URI, namespaces, attributes); + } + else if (localname.equalsIgnoreCase("any") + || localname.equalsIgnoreCase("anyAttribute")) + { + // the type containing this is to be created as open + if (!bInInvalidContent) currentType.isOpen = true; + } + + + /////////////////////////////////////////////////////////////////////// + // Handle complexType + // These become new types + /////////////////////////////////////////////////////////////////////// + else if (localname.equalsIgnoreCase("complexType")) + { + if (!bInInvalidContent) startComplexType(localname, prefix, URI, namespaces, attributes); + } // end complexType handling + + else if (localname.equalsIgnoreCase("choice") + || localname.equalsIgnoreCase("sequence") + || localname.equalsIgnoreCase("all")) + { + if (!bInInvalidContent) startGroup(localname, prefix, URI, namespaces, attributes); + } // end Group handling + + else if ( localname.equalsIgnoreCase("group") + || localname.equalsIgnoreCase("attributeGroup")) + { + + int i; + for (i=0; i < attributes.size(); i++) + { + if (attributes[i].getName().equalsIgnoreCase("ref")) + { + XMLQName qname(attributes[i].getValue(), + schemaInfo.getSchemaNamespaces(), + namespaces); + if (qname.getURI().isNull()) + { + replayEvents(schemaInfo.getTargetNamespaceURI(), qname.getLocalName(), + localname.equalsIgnoreCase("group")); + } + else + { + replayEvents(qname.getURI(), qname.getLocalName(), + localname.equalsIgnoreCase("group")); + } + } + } + inGroup++; + // if theres no 'ref' then its a group definition, and we + // already pre-parsed it. + } + else if (localname.equalsIgnoreCase("list")) + { + startList( + localname, + prefix, + URI, + namespaces, + attributes); + } + + /////////////////////////////////////////////////////////////////////// + // Handle simpleType + // These become new types + /////////////////////////////////////////////////////////////////////// + else if (localname.equalsIgnoreCase("simpleType")) + { + if (!bInInvalidContent) startSimpleType(localname, prefix, URI, namespaces, attributes); + } // end complexType handling + + else if (localname.equalsIgnoreCase("restriction")) + { + if (!bInInvalidContent) startRestriction(localname, prefix, URI, namespaces, attributes); + } + + else if (localname.equalsIgnoreCase("extension")) + { + if (!bInInvalidContent) startExtension(localname, prefix, URI, namespaces, attributes); + } + // Handle <import> of other schema + else if (localname.equalsIgnoreCase("union")) + { + // TODO - unions not yet supported + bInInvalidContent = true; + if (setter) + { + setter->setError("Schema contains a union which is not yet implemented"); + } + } + } + } + } + else // not in schema - check for any extra namespaces + { + schemaInfo.getSchemaNamespaces().merge(namespaces); + } + + } + + + // ============================================================================ + // endElementNs + // ============================================================================ + void SDOSchemaSAX2Parser::endElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI) + { + LOGINFO_1( INFO,"SchemaParser:endElementNs:%s",(const char*)localname); + + if (URI.equalsIgnoreCase("http://www.w3.org/2001/XMLSchema")) + { + if (localname.equalsIgnoreCase("schema")) + { + bInSchema = false; + } + + /////////////////////////////////////////////////////////////////////// + // Handle complexType + // Pop the Type off our stack + /////////////////////////////////////////////////////////////////////// + + // We do not support unions, so all inside a union, plus the containing + // element are invalid for now. + // + if (!bInInvalidContent) + { + if (preParsing) + { + if (inGroup > 0) + { + if (localname.equalsIgnoreCase("group") + || localname.equalsIgnoreCase("attributeGroup")) + { + inGroup--; + if (inGroup < 0)inGroup = 0; // should never happen. + } + if (inGroup > 0) // still need to store end of group ref + { + storeEndElementEvent( + localname, + prefix, + URI); + } + } + } + else + { + if (localname.equalsIgnoreCase("group") + || localname.equalsIgnoreCase("attributeGroup")) + { + inGroup--; + if (inGroup < 0) inGroup = 0; + // outside of preparse, dont need to do anything. + } + else if (inGroup == 0) + { + if (localname.equalsIgnoreCase("complexType")) + { + if (!bInvalidElement) defineType(); + } // end complexType handling + else if (localname.equalsIgnoreCase("simpleType")) + { + if (!bInvalidElement) defineType(); + } + else if (localname.equalsIgnoreCase("schema")) + { + if (!bInvalidElement) defineType(); + } // end complexType handling + else if (localname.equalsIgnoreCase("element") + || localname.equalsIgnoreCase("attribute")) + { + // PropertyDefinition should now be complete + if (!bInvalidElement) defineProperty(); + } + else if (localname.equalsIgnoreCase("choice") + || localname.equalsIgnoreCase("sequence") + || localname.equalsIgnoreCase("all")) + { + if (!bInvalidElement) currentType.isMany = false; + } + else if (localname.equalsIgnoreCase("list")) + { + // PropertyDefinition should now be complete + if (!bInvalidList) defineProperty(); + bInvalidList = false; + } + bInvalidElement = false; + } + } + + } // bInUnsupportedContent + if (localname.equalsIgnoreCase("union")) + { + bInInvalidContent = false; + // the enclosing element is not useful + bInvalidElement = true; + } + } + + } + + // ============================================================================ + // used by startInclude to try to locate the file + // ============================================================================ + + int SDOSchemaSAX2Parser::startSecondaryParse( + SDOSchemaSAX2Parser& schemaParser, + SDOXMLString& schemaLocation) + { + int i,j,k; + SDOXMLString sl = getCurrentFile(); + + i = sl.lastIndexOf('/'); + j = sl.lastIndexOf('\\'); + if ((j > i) || (i < 0))i=j; + if (i>=0) + { + sl = sl.substring(0,i+1) + schemaLocation; + try { + if (-1 != schemaParser.parse((const char *)sl)) + return 1; + } + catch (SDORuntimeException e) + { + } + k = schemaLocation.lastIndexOf('/'); + j = schemaLocation.lastIndexOf('\\'); + if ((j > k) || (k < 0))k=j; + if (k>=0) + { + sl = sl.substring(0,i+1) + schemaLocation.substring(0,k+1); + try { + if (-1 != schemaParser.parse((const char *)sl)) + return 1; + } + catch (SDORuntimeException e) + { + } + } + } + try { + if (-1 != schemaParser.parse((const char *)schemaLocation)) + return 1; + } + catch (SDORuntimeException e) + { + } + k = schemaLocation.lastIndexOf('/'); + j = schemaLocation.lastIndexOf('\\'); + if ((j > k) || (k < 0))k=j; + if (k>=0) + { + sl = schemaLocation.substring(0,k+1); + try { + if (-1 != schemaParser.parse((const char *)sl)) + return 1; + } + catch (SDORuntimeException e) + { + } + } + return 0; + } + + + // ============================================================================ + // startInclude + // ============================================================================ + void SDOSchemaSAX2Parser::startInclude( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startInclude:%s",(const char*)localname); + + if (!bInSchema) return; + + SDOXMLString schemaLocation = attributes.getValue("schemaLocation"); + if (!schemaLocation.isNull()) + { + SchemaInfo schemaInf; + SDOSchemaSAX2Parser schemaParser(schemaInf, (ParserErrorSetter*)setter); + + if (startSecondaryParse(schemaParser,schemaLocation) == 0) + { + // + // we were not able to start the parse + return; + } + + + TypeDefinitionsImpl& typedefs = schemaParser.getTypeDefinitions(); + XMLDAS_TypeDefs types = typedefs.types; + XMLDAS_TypeDefs::iterator iter; + for (iter=types.begin(); iter != types.end(); iter++) + { + if ((*iter).second.name.equals("RootType") + && currentType.name.equals("RootType") + && (*iter).second.uri.equals(currentType.uri)) + { + // This must be true for an import/include to be + // legally positioned + + XMLDAS_TypeDefs::iterator find = typeDefinitions.types.find( + (*iter).first); + + std::list<PropertyDefinitionImpl>::iterator propit; + std::list<PropertyDefinitionImpl>::iterator currpropit; + bool found; + + for (propit = (*iter).second.properties.begin() ; + propit != (*iter).second.properties.end(); ++ propit) + { + found = false; + // do not merge properties whose names clash + for ( currpropit = currentType.properties.begin(); + currpropit != currentType.properties.end(); + ++currpropit) + { + if ((*currpropit).name.equals((*propit).name)) + { + found = true; + break; + } + } + if (!found) + { + currentType.properties.insert( + currentType.properties.end(),*propit); + } + } + } + else + { + typeDefinitions.types.insert(*iter); + } + } + } + } + + + // ============================================================================ + // startList + // ============================================================================ + void SDOSchemaSAX2Parser::startList( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + + LOGINFO_1( INFO,"SchemaParser:startList:%s",(const char*)localname); + + if (!bInSchema) return; + + // invent a property called "values" to hold the list + + SDOXMLString typeName = attributes.getValue("itemType"); + + if (typeName.isNull()) + { + // we do not support lists with no item type (yet). + if (setter) + { + setter->setError("Schema contains a list with no type - not supported"); + } + bInvalidList = true; + return; + } + + currentType.dataType = false; + currentType.isFromList = true; + + // attribute to set the list type + // define an internal property to hold the list + PropertyDefinitionImpl thisProperty; + thisProperty.name = "values"; + thisProperty.localname = "values"; + thisProperty.isContainment = false; + thisProperty.isElement=true; + thisProperty.isMany = true; + + XMLQName qname = resolveTypeName( + typeName, + namespaces, + thisProperty.typeUri, + thisProperty.typeName); + thisProperty.fullTypeName = typeName; + + setCurrentProperty(thisProperty); + + } + + // ============================================================================ + // startElement + // ============================================================================ + void SDOSchemaSAX2Parser::startElement( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + + if (!bInSchema) return; + + PropertyDefinitionImpl thisProperty; + + LOGINFO_1( INFO,"SchemaParser:startElement:%s",(const char*)localname); + + thisProperty.isElement = true; + + setName(attributes, + thisProperty.name, + thisProperty.localname); + + + setType(thisProperty, attributes, namespaces); + + SDOXMLString maxOccurs = attributes.getValue("maxOccurs"); + if (!maxOccurs.isNull()) + { + if (!maxOccurs.equalsIgnoreCase("1")) + { + thisProperty.isMany = true; + } + } + + // find aliases + thisProperty.aliases = attributes.getValue("aliasName"); + + // mark this as a substitution group. + // TODO - what about properties which have already been set into the tree, + // and might have a substitution? + + SDOXMLString substituteName = attributes.getValue("substitutionGroup"); + if (! substituteName.isNull()) + { + XMLQName qname = resolveTypeName( + substituteName, + namespaces, + thisProperty.substituteUri, + thisProperty.substituteName); + thisProperty.isSubstitute=true; + } + + // count the number of elements in the group + if (currentType.isMany) + { + currentType.groupElementCount++; + } + + setCurrentProperty(thisProperty); + + } + + // ============================================================================ + // startAttribute + // ============================================================================ + void SDOSchemaSAX2Parser::startAttribute( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + + LOGINFO_1( INFO,"SchemaParser:startAttribute:%s",(const char*)localname); + + if (!bInSchema) return; + + PropertyDefinitionImpl thisProperty; + + thisProperty.isElement = false; + + setName(attributes, + thisProperty.name, + thisProperty.localname); + + setType(thisProperty, attributes, namespaces); + + setCurrentProperty(thisProperty); + } + + // ============================================================================ + // startComplexType + // ============================================================================ + void SDOSchemaSAX2Parser::startComplexType( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startComplexType:%s",(const char*)localname); + + if (!bInSchema) return; + + TypeDefinitionImpl thisType; // set defaults + thisType.uri=schemaInfo.getTargetNamespaceURI(); + + setTypeName(thisType, attributes,namespaces); + + + + for (int i=0; i < attributes.size(); i++) + { + // If sdo:sequence="true" or mixed="true" it is sequenced + if ( (attributes[i].getUri().equalsIgnoreCase("commonj.sdo/xml") + && attributes[i].getName().equalsIgnoreCase("sequence")) + || attributes[i].getName().equalsIgnoreCase("mixed")) + { + if (attributes[i].getValue().equals("true")) + { + thisType.isSequenced = true; + } + } + // If abstract="true" it is abstract + else if (attributes[i].getName().equalsIgnoreCase("abstract")) + { + if (attributes[i].getValue().equals("true")) + { + thisType.isAbstract = true; + } + } + else if (attributes[i].getName().equalsIgnoreCase("aliasName")) + { + thisType.aliases = attributes[i].getValue(); + } + } + + setCurrentType(thisType); + } + + // ============================================================================ + // startSimpleType + // ============================================================================ + void SDOSchemaSAX2Parser::startSimpleType( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startSimpleType:%s",(const char*)localname); + + if (!bInSchema) return; + + TypeDefinitionImpl thisType; // set defaults + thisType.uri=schemaInfo.getTargetNamespaceURI(); + thisType.dataType = true; + + for (int i=0; i < attributes.size(); i++) + { + // If abstract="true" it is abstract + if (attributes[i].getName().equalsIgnoreCase("abstract")) + { + if (attributes[i].getValue().equals("true")) + { + thisType.isAbstract = true; + } + } + else if (attributes[i].getName().equalsIgnoreCase("aliasName")) + { + thisType.aliases = attributes[i].getValue(); + } + } + setTypeName(thisType, attributes,namespaces); + + // see if the type is going to be abstract... + + + setCurrentType(thisType); + } + + // ============================================================================ + // startRestriction + // ============================================================================ + void SDOSchemaSAX2Parser::startRestriction( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startRestriction:%s",(const char*)localname); + + if (!bInSchema) return; + + SDOXMLString base = attributes.getValue("base"); + if (!base.isNull()) + { + // Resolve typename to uri:name + XMLQName qname = resolveTypeName( + base, + namespaces, + currentType.parentTypeUri, + currentType.parentTypeName); + + currentType.isRestriction=true; + + + if(qname.getLocalName().equals("QName")) + { + currentType.isQName = true; + } + } + } + + // ============================================================================ + // startExtension + // ============================================================================ + void SDOSchemaSAX2Parser::startExtension( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startExtension:%s",(const char*)localname); + + if (!bInSchema) return; + + SDOXMLString base = attributes.getValue("base"); + if (!base.isNull()) + { + SDOXMLString typeUri; + SDOXMLString typeName; + // Resolve typename to uri:name + XMLQName qname = resolveTypeName( + base, + namespaces, + typeUri, + typeName); + + // If extending a simple type (an SDO DataType) we create a + // Property named "value" of this type rather than set the + // simple type as a base + currentType.isRestriction=false; + + // ?? Does this only apply within a <simpleContent> tag?? + if (typeUri.equalsIgnoreCase(Type::SDOTypeNamespaceURI.c_str())) + { + // here the type needs to be flagged so that + // we know to serialize this property as an element with + // just the contents <element>abc</element> rather than + // value=abc + + + PropertyDefinitionImpl thisProperty; + thisProperty.name = "value"; + thisProperty.localname = "value"; + thisProperty.typeUri = typeUri; + thisProperty.typeName = typeName; + thisProperty.fullTypeName = base; + thisProperty.isContainment = false; + thisProperty.isElement=true; + + currentType.isExtendedPrimitive= true; + + if(qname.getLocalName().equals("QName")) + { + thisProperty.isQName = true; + } + + setCurrentProperty(thisProperty); + defineProperty(); + } + else + { + currentType.parentTypeUri = typeUri; + currentType.parentTypeName = typeName; + } + } + } + + // ============================================================================ + // startGroup + // ============================================================================ + void SDOSchemaSAX2Parser::startGroup( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes) + { + LOGINFO_1( INFO,"SchemaParser:startGroup:%s",(const char*)localname); + + if (!bInSchema) return; + + SDOXMLString maxOccurs = attributes.getValue("maxOccurs"); + if (!maxOccurs.isNull()) + { + if (!maxOccurs.equalsIgnoreCase("1")) + { + currentType.isMany = true; + } + } + } + + // ============================================================================ + // setCurrentType + // ============================================================================ + void SDOSchemaSAX2Parser::setCurrentType(const TypeDefinitionImpl& type) + { + typeStack.push(currentType); + currentType = type; + } + + // ============================================================================ + // defineType + // ============================================================================ + void SDOSchemaSAX2Parser::defineType() + { + // Set this Type as sequenced of more than one element in a group definition + if (currentType.groupElementCount > 1) + { + currentType.isSequenced = true; + } + + SDOXMLString typeQname = TypeDefinitionsImpl::getTypeQName(currentType.uri, currentType.localname); + typeDefinitions.types[typeQname] = currentType; + + if (currentProperty.typeName.isNull()) + { + // Set the type name to the name of this type + currentProperty.typeUri = currentType.uri; + currentProperty.typeName = currentType.localname; + } + + if (typeStack.size() != 0) + { + currentType = typeStack.top(); + typeStack.pop(); + } + else + { + currentType = TypeDefinitionImpl(); + } + } + + // ============================================================================ + // setCurrentProperty + // ============================================================================ + void SDOSchemaSAX2Parser::setCurrentProperty(const PropertyDefinitionImpl& prop) + { + propertyStack.push(currentProperty); + currentProperty = prop; + } + + // ============================================================================ + // defineProperty + // ============================================================================ + void SDOSchemaSAX2Parser::defineProperty() + { + + if (currentProperty.typeName.isNull()) + { + // Set the type of this property to default (sdo:String) + currentProperty.typeUri = Type::SDOTypeNamespaceURI.c_str(); + currentProperty.typeName = "String"; + } + + if (currentProperty.localname.isNull()) + currentProperty.localname = currentProperty.typeName; + + // Set isMany if property isMany OR if containing type isMany + // NOTE: The above comment is as per the SDO2.0 spec however this does not + // work when serializing a sequence containing a single-valued property and + // then deserializing. + // currentProperty.isMany = currentProperty.isMany || currentType.isMany; + + + currentType.properties.insert(currentType.properties.end(), currentProperty); + if (propertyStack.size() != 0) + { + currentProperty = propertyStack.top(); + propertyStack.pop(); + } + else + currentProperty = PropertyDefinitionImpl(); + + } + + // ============================================================================ + // setDefault + // ============================================================================ + void SDOSchemaSAX2Parser::setDefault( + PropertyDefinitionImpl& thisProperty, + const SAX2Attributes& attributes) + { + thisProperty.defaultValue = attributes.getValue("fixed"); + if (!thisProperty.defaultValue.isNull()) + { + thisProperty.isReadOnly = true; + } + else + { + thisProperty.defaultValue = attributes.getValue("default"); + } + } + + // ============================================================================ + // setName + // ============================================================================ + void SDOSchemaSAX2Parser::setName( + const SAX2Attributes& attributes, + SDOXMLString& sdoname, + SDOXMLString& localname) + { + for (int i=0; i < attributes.size(); i++) + { + // Handle sdo: annotations + if (attributes[i].getUri().equalsIgnoreCase("commonj.sdo/xml")) + { + // sdo:name overrides the property name + if (attributes[i].getName().equalsIgnoreCase("name")) + { + sdoname = attributes[i].getValue(); + } + } + else + { + + if (attributes[i].getName().equalsIgnoreCase("name")) + { + localname = attributes[i].getValue(); + // If name is already set it must have been an + // override using sdo:name + if (sdoname.isNull()) + { + sdoname = localname; + } + } + } + } + + } + + // ============================================================================ + // setType + // ============================================================================ + void SDOSchemaSAX2Parser::setType( + PropertyDefinitionImpl& property, + const SAX2Attributes& attributes, + const SAX2Namespaces& namespaces) + { + property.fullLocalTypeName = attributes.getValue("type"); + if (!property.fullLocalTypeName.isNull()) + { + XMLQName qname(property.fullLocalTypeName,schemaInfo.getSchemaNamespaces(), namespaces); + if (qname.getLocalName().equals("IDREF") + || qname.getLocalName().equals("IDREFS")) + { + property.fullTypeName = attributes.getValue("commonj.sdo/xml","propertyType"); + + property.isIDREF = true; + property.isContainment = false; + + if (qname.getLocalName().equals("IDREFS")) + { + property.isMany = true; + } + } + else if (qname.getLocalName().equals("anyURI")) + { + property.fullTypeName = attributes.getValue("commonj.sdo/xml","propertyType"); + } + else if (qname.getLocalName().equals("ID")) + { + property.isID = true; + currentType.IDPropertyName = property.name; + } + + else + { + property.fullTypeName = attributes.getValue("commonj.sdo/xml","dataType"); + } + } + + else + { + property.fullLocalTypeName = attributes.getValue("ref"); + if (!property.fullLocalTypeName.isNull()) + { + property.isReference = true; + } + } + + if (property.fullTypeName.isNull()) + { + property.fullTypeName = property.fullLocalTypeName; + } + + if (!property.fullTypeName.isNull()) + { + // Resolve typename to uri:name + XMLQName qname = resolveTypeName( + property.fullTypeName, + namespaces, + property.typeUri, + property.typeName); + + if(qname.getLocalName().equals("QName")) + { + property.isQName = true; + } + } + + } + + // ============================================================================ + // setTypeName + // ============================================================================ + void SDOSchemaSAX2Parser::setTypeName( + TypeDefinitionImpl& type, + const SAX2Attributes& attributes, + const SAX2Namespaces& namespaces) + { + std::map<SDOXMLString,SDOXMLString>::iterator it; + setName(attributes, type.name, type.localname); + // If localname is not set it is anonymous so use the enclosing element name + + + if (type.localname.isNull()) + { + type.localname = currentProperty.name; + } + else + { + // check for an overriding url in the name + int i; + if ((i = type.localname.firstIndexOf(':')) > 0) + { + XMLQName qname(type.localname, + schemaInfo.getSchemaNamespaces(), + namespaces); + type.uri = qname.getURI(); + type.localname = qname.getLocalName(); + } + } + + // Set SDO name if not specified + if (type.name .isNull()) + { + type.name = type.localname ; + } + else + { + // check for an overriding url in the name + int i; + if ((i = type.name.firstIndexOf(':')) > 0) + { + XMLQName qname(type.name, + schemaInfo.getSchemaNamespaces(), + namespaces); + type.uri = qname.getURI(); + type.name = qname.getLocalName(); + } + } + } + + std::istream& operator>>(std::istream& input, SDOSchemaSAX2Parser& parser) + { + parser.stream(input); + + return input; + } + + std::istringstream& operator>>(std::istringstream& input, SDOSchemaSAX2Parser& parser) + { + parser.stream(input); + + return input; + } + + void SDOSchemaSAX2Parser::stream(std::istream& input) + { + // override to parse twice for groups + + stream_twice(input); + } + + + int SDOSchemaSAX2Parser::parse(const char* filename) + { + return parse_twice(filename); + } + + + + // ============================================================================ + // resolveTypeName + // ============================================================================ + XMLQName SDOSchemaSAX2Parser::resolveTypeName( + const SDOXMLString& fullTypeName, + const SAX2Namespaces& namespaces, + SDOXMLString& uri, + SDOXMLString& name) + { + XMLQName qname(fullTypeName, + schemaInfo.getSchemaNamespaces(), + namespaces); + + uri = qname.getURI(); + name = qname.getLocalName(); + + /////////////////////////////////////////////////////////////////////// + // Map the xsd types to SDO Types + /////////////////////////////////////////////////////////////////////// + if (qname.getURI().equalsIgnoreCase("http://www.w3.org/2001/XMLSchema")) + { + uri = Type::SDOTypeNamespaceURI.c_str(); + name = SDOUtils::XSDToSDO((const char*)(qname.getLocalName())); + if (name.isNull()) + { + name = "String"; + } + + } + + // Temporary hack: ChangeSummaryType is ChangeSummary in core + else if (qname.getURI().equalsIgnoreCase(Type::SDOTypeNamespaceURI.c_str())) + { + if (qname.getLocalName().equalsIgnoreCase("ChangeSummaryType")) + { + name = "ChangeSummary"; + } + + } + else if (qname.getURI().isNull()) + { + uri = schemaInfo.getTargetNamespaceURI(); + } + + return qname; + } + + } // End - namespace sdo + +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h new file mode 100644 index 0000000000..c3cd319183 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h @@ -0,0 +1,232 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#ifndef _SDOSCHEMASAX2PARSER_H_ +#define _SDOSCHEMASAX2PARSER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SAX2Parser.h" +#include "commonj/sdo/SchemaInfo.h" +#include "stack" +#include "commonj/sdo/TypeDefinitionsImpl.h" +#include "commonj/sdo/GroupDefinition.h" +#include "commonj/sdo/XMLQName.h" +#include "commonj/sdo/ParserErrorSetter.h" + +namespace commonj +{ + namespace sdo + { + + + +/** + * SDOSAX2Parser implements SAX2Parser. + * This class gets called back by the libxml library, and + * deals with the creation of metadata objects from XSD. + */ + + class SDOSchemaSAX2Parser : public SAX2Parser + { + + public: + + SDOSchemaSAX2Parser(SchemaInfo& schemaInfo, + ParserErrorSetter* insetter); + + virtual ~SDOSchemaSAX2Parser(); + + + virtual void startElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void endElementNs( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI); + + + virtual void stream(std::istream& input); + + virtual int parse(const char* filename); + + virtual void endDocument(); + + + const SDOXMLString& getTargetNamespaceURI() const {return schemaInfo.getTargetNamespaceURI();} + + TypeDefinitionsImpl& getTypeDefinitions() {return typeDefinitions;} + + friend std::istream& operator>>(std::istream& input, SDOSchemaSAX2Parser& parser); + friend std::istringstream& operator>>(std::istringstream& input, SDOSchemaSAX2Parser& parser); + + + private: + + // group handling. + + int inGroup; + bool preParsing; + GroupDefinition* currentGroup; + std::vector<GroupDefinition> groupList; + + bool bInSchema; // only parse when within a schema + bool bInvalidElement; // where element content is not valid + bool bInInvalidContent; // actually inside invalid content. + bool bInvalidList; // a list with no type - not supported. + + virtual void replayEvents( + const SDOXMLString& uri, + const SDOXMLString& name, + bool isGroup); + + virtual void storeStartElementEvent( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void storeEndElementEvent( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI + ); + + virtual int startSecondaryParse( + SDOSchemaSAX2Parser& schemaParser, + SDOXMLString& schemaLocation); + + virtual void startInclude( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startElement( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startAttribute( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startComplexType( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startSimpleType( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startRestriction( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startExtension( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startGroup( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + virtual void startList( + const SDOXMLString& localname, + const SDOXMLString& prefix, + const SDOXMLString& URI, + const SAX2Namespaces& namespaces, + const SAX2Attributes& attributes); + + XMLQName resolveTypeName( + const SDOXMLString& fullTypeName, + const SAX2Namespaces& namespaces, + SDOXMLString& uri, + SDOXMLString& name); + + void setName( + const SAX2Attributes& attributes, + SDOXMLString& sdoname, + SDOXMLString& localname + ); + + void setType( + PropertyDefinitionImpl& property, + const SAX2Attributes& attributes, + const SAX2Namespaces& namespaces); + + void setTypeName( + TypeDefinitionImpl& type, + const SAX2Attributes& attributes, + const SAX2Namespaces& namespaces); + + void setDefault( + PropertyDefinitionImpl& thisProperty, + const SAX2Attributes& attributes); + + + SchemaInfo& schemaInfo; + + + PropertyDefinitionImpl currentProperty; + std::stack<PropertyDefinitionImpl> propertyStack; + void setCurrentProperty(const PropertyDefinitionImpl& property); + void defineProperty(); + + TypeDefinitionImpl currentType; + std::stack<TypeDefinitionImpl> typeStack; + void setCurrentType(const TypeDefinitionImpl& type); + void defineType(); + + TypeDefinitionsImpl typeDefinitions; + + + }; + + + } // End - namespace sdo +} // End - namespace commonj +#endif //_SDOSCHEMASAX2PARSER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOString.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOString.cpp new file mode 100644 index 0000000000..e291c38f76 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOString.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +// This class probably needs to inherit from RefCountingObject to ensure that objects of this type get cleaned up correctly. + +#include "commonj/sdo/SDOString.h" +#include <iostream> +// #include "libxml/globals.h" + +#include <ctype.h> +#include <string> + +// C6 duff compilation - see http://www.codecomments.com/message294418.html +using std::string; +#define std_string string + +namespace commonj +{ + namespace sdo + { + SDOString SDOString::toLower(unsigned int start, unsigned int length) + { + std::string result_string; + result_string.reserve(size()); + + for (unsigned int i = start; (i < size() && i < length); i++) + { + result_string[i] = tolower((*this)[i]); + } + + return SDOString(result_string); + } + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOString.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOString.h new file mode 100644 index 0000000000..2452a7f3a7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOString.h @@ -0,0 +1,79 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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/disable_warn.h" + +#ifndef _SDOString_H_ +#define _SDOString_H_ +#include "commonj/sdo/export.h" + +#include <iostream> +using std::string; + +namespace commonj +{ + namespace sdo + { + /** + * SDOString - utility class for string handling. + * Keeps the string handling local to one place, so we can + * replace it with a more NLS friendly version later. + */ + + class SDOString : public string + { + public: + SDO_API SDOString substr(size_t i = 0, size_t n = std::string::npos) const + { + return SDOString(string::substr(i, n)); + } + + SDO_API SDOString toLower(unsigned int start = 0, + unsigned int length = 0); + SDO_API SDOString(const string& str) : string(str) {} + // SDO_SPI SDOString(const std::string& str, size_t pos); + SDO_API SDOString(const std::string& str, size_t pos, size_t n = std::string::npos) + : string(str, pos, n) {} + SDO_API SDOString(const char* str) : string(str) {} + SDO_API SDOString() : string() {} + SDO_API virtual ~SDOString() {} + + + // User defined conversion so that the compiler will automatically convert SDOString to const char * + + // This is currently omitted because it can lead to confusion over + // which method should be called. For example, suppose we have two + // (overloaded) methods + // 1. void fn(const char* first, const char* second) + // 2. void fn(const SDOString& first, const SDOString& second) + // and we make a call passing a C style string as the first parameter and an SDOString + // as the second parameter. Currently, the first parameter is + // converted to an SDOString and the second method is called. If the + // conversion below is uncommented, then the compiler also has the + // option to convert the second parameter to a C style string and then + // call the first method - and it is ambiguous which of these to choose, + // leading to a compile time error. + + // operator const char*() const { return c_str(); } + + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif // _SDOString_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp new file mode 100644 index 0000000000..8916400144 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp @@ -0,0 +1,228 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/03/16 12:21:39 $ */ + +#include "commonj/sdo/SDOUtils.h" + +using namespace std; + +// +// Utility methods to print a DataObject tree +// + +namespace commonj { + namespace sdo { + +////////////////////////////////////////////////////////////////////////// +// Conversions +////////////////////////////////////////////////////////////////////////// + + + std::map<std::string,std::string> SDOUtils::SdoToXsd; + + std::map<std::string,std::string> SDOUtils::XsdToSdo; + + bool SDOUtils::populated = false; + + bool SDOUtils::populate() + { + SDOUtils::XsdToSdo["ID"] = "String"; + SDOUtils::XsdToSdo["NCName"] = "String"; + SDOUtils::XsdToSdo["string"] = "String"; + SDOUtils::XsdToSdo["anyType"] = "DataObject"; + SDOUtils::XsdToSdo["int"] = "Integer"; + SDOUtils::XsdToSdo["integer"] = "Integer"; + SDOUtils::XsdToSdo["negativeInteger"] = "Integer"; + SDOUtils::XsdToSdo["nonNegativeInteger"] = "Integer"; + SDOUtils::XsdToSdo["positiveInteger"] = "Integer"; + SDOUtils::XsdToSdo["nonpositiveInteger"] = "Integer"; + SDOUtils::XsdToSdo["unsignedShort"] = "Integer"; + SDOUtils::XsdToSdo["unsignedInt"] = "Integer"; + SDOUtils::XsdToSdo["unsignedLong"] = "Long"; + SDOUtils::XsdToSdo["double"] = "Double"; + SDOUtils::XsdToSdo["short"] = "Short"; + SDOUtils::XsdToSdo["unsignedByte"] = "Short"; + SDOUtils::XsdToSdo["float"] = "Float"; + SDOUtils::XsdToSdo["boolean"] = "Boolean"; + SDOUtils::XsdToSdo["byte"] = "Byte"; + SDOUtils::XsdToSdo["base64Binary"] = "Bytes"; + SDOUtils::XsdToSdo["hexBinary"] = "Bytes"; + SDOUtils::XsdToSdo["anyURI"] = "URI"; + SDOUtils::XsdToSdo["QName"] = "URI"; + + SDOUtils::SdoToXsd["String"] = "string"; + SDOUtils::SdoToXsd["DataObject"] = "anyType"; + SDOUtils::SdoToXsd["Integer"] = "integer"; + SDOUtils::SdoToXsd["Long"] = "unsignedLong"; + SDOUtils::SdoToXsd["Double"] = "double"; + SDOUtils::SdoToXsd["Short"] = "short"; + SDOUtils::SdoToXsd["Float"] = "float"; + SDOUtils::SdoToXsd["Boolean"] = "boolean"; + SDOUtils::SdoToXsd["Byte"] = "byte"; + SDOUtils::SdoToXsd["Bytes"] = "base64Binary"; + SDOUtils::SdoToXsd["URI"] = "anyURI"; + + SDOUtils::populated = true; + return true; + } + + const char* SDOUtils::SDOToXSD(const char* sdoname) + { + if (sdoname == 0) + { + return SDOUtils::SdoToXsd["String"].c_str(); + } + if (!SDOUtils::populated) SDOUtils::populate(); + string& s = SDOUtils::SdoToXsd[sdoname]; + if (s.empty()) + { + return SDOUtils::SdoToXsd["String"].c_str(); + } + return s.c_str(); + } + + + const char* SDOUtils::XSDToSDO(const char* xsdname) + { + if (xsdname == 0) + { + return SDOUtils::XsdToSdo["string"].c_str(); + } + if (!SDOUtils::populated) SDOUtils::populate(); + string& s = SDOUtils::XsdToSdo[xsdname]; + if (s.empty()) + return SDOUtils::XsdToSdo["string"].c_str(); + return s.c_str(); + } + +////////////////////////////////////////////////////////////////////////// +// Print Tabs +////////////////////////////////////////////////////////////////////////// + + void SDOUtils::printTabs(ostream& out, unsigned int incr) + { + for (int ind=0; ind < incr; ind++) + { + out << " "; + } + } + +////////////////////////////////////////////////////////////////////////// +// Print a DatObject tree +////////////////////////////////////////////////////////////////////////// + + void SDOUtils::printDataObject(ostream& out, DataObjectPtr dataObject) + { + printDataObject(out, dataObject,0); + } + + + void SDOUtils::printDataObject(ostream& out ,DataObjectPtr dataObject, + unsigned int incr) + { + + out << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO" + << endl; + + if (!dataObject)return; + + const Type& dataObjectType = dataObject->getType(); + printTabs(out, incr); + out << "DataObject type: " + << dataObjectType.getURI() + << "#" << dataObjectType.getName() << endl; + + incr++; + + ////////////////////////////////////////////////////////////// + // Iterate over all the properties + ////////////////////////////////////////////////////////////// + PropertyList pl = dataObject->getInstanceProperties(); + for (int i = 0; i < pl.size(); i++) + { + printTabs(out, incr); + out << "Property: " << pl[i].getName() << endl; + + const Type& propertyType = pl[i].getType(); + + printTabs(out, incr); + + out << "Property Type: " + << propertyType.getURI() + << "#" << propertyType.getName() << endl; + + if (dataObject->isSet(pl[i])) + { + + /////////////////////////////////////////////////////////// + // For a many-valued property get the list of values + /////////////////////////////////////////////////////////// + if (pl[i].isMany()) + { + incr++; + DataObjectList& dol = dataObject->getList(pl[i]); + char cc[20]; + for (int j = 0; j <dol.size(); j++) + { + printTabs(out, incr); + // seems to be a bug in ostream? Will not print j + // as an integer. + out << "Value "; + sprintf(cc,"%d",j); + out << cc; + out << endl; + incr++; + printDataObject(out, dol[j],incr); + incr--; + out << endl; + } + incr--; + } // end IsMany + + ////////////////////////////////////////////////////////////////////// + // For a primitive data type print the value + ////////////////////////////////////////////////////////////////////// + else if (propertyType.isDataType()) + { + printTabs(out, incr); + out<< "Property Value: " + << dataObject->getCString(pl[i]) <<endl ; + } + + ////////////////////////////////////////////////////////////////////// + // For a dataobject print the do + ////////////////////////////////////////////////////////////////////// + else + { + incr++; + printDataObject(out, dataObject->getDataObject(pl[i]),incr); + incr--; + } + } + else + { + printTabs(out, incr); + out << "Property Value: not set" <<endl ; + } + + } + incr--; + out << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do" << endl; + } + }; +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOUtils.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOUtils.h new file mode 100644 index 0000000000..0fed291164 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOUtils.h @@ -0,0 +1,63 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/03/16 12:21:39 $ */ + +#ifndef _SDOUTILS_H_ +#define _SDOUTILS_H_ + +#include "commonj/sdo/DataObject.h" +#include <map> +#include <string> + +namespace commonj +{ + namespace sdo + { + + + /** + * SDOUtils will provide utility functions. + * The class currently holds a method to print data objects. + */ + + class SDOUtils + { + + public: + + static SDO_API void printDataObject(std::ostream& out, DataObjectPtr d); + static SDO_API const char* SDOToXSD(const char* sdoname); + static SDO_API const char* XSDToSDO(const char* xsdname); + + private: + + static bool populate(); + static bool populated; + + static void printDataObject(std::ostream& out, DataObjectPtr d, unsigned int incr); + static void printTabs(std::ostream& out, unsigned int incr); + + static std::map<std::string,std::string> XsdToSdo; + static std::map<std::string,std::string> SdoToXsd; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOUTILS_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLBufferWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLBufferWriter.cpp new file mode 100644 index 0000000000..6812ef166b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLBufferWriter.cpp @@ -0,0 +1,55 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SDOXMLBufferWriter.h" +#include "commonj/sdo/SDORuntimeException.h" + +namespace commonj +{ + namespace sdo + { + + + + + SDOXMLBufferWriter::SDOXMLBufferWriter(DataFactoryPtr dataFactory) + : SDOXMLWriter(dataFactory) + { + buf = xmlBufferCreate(); + if (buf == NULL) + { + SDO_THROW_EXCEPTION("SDOXMLBufferWriter", SDOXMLParserException, "xmlBufferCreate failed"); + } + setWriter(xmlNewTextWriterMemory(buf, 0)); + } + + SDOXMLBufferWriter::~SDOXMLBufferWriter() + { + freeWriter(); + xmlBufferFree(buf); + } + + SDOXMLString SDOXMLBufferWriter::getBuffer() + { + freeWriter(); + return buf->content; + } + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLBufferWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLBufferWriter.h new file mode 100644 index 0000000000..489f44b86c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLBufferWriter.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SDOXMLBUFFERWRITER_H_ +#define _SDOXMLBUFFERWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLWriter.h" + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXMLBufferWriter extends SDOXMLWriter and writes a buffer. + */ + class SDOXMLBufferWriter : public SDOXMLWriter + { + + public: + + SDOXMLBufferWriter(DataFactoryPtr dataFactory = NULL); + virtual ~SDOXMLBufferWriter(); + + SDOXMLString getBuffer(); + private: + xmlBufferPtr buf; + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXMLBUFFERWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLFileWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLFileWriter.cpp new file mode 100644 index 0000000000..09d80075c9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLFileWriter.cpp @@ -0,0 +1,44 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SDOXMLFileWriter.h" + +namespace commonj +{ + namespace sdo + { + + + + + SDOXMLFileWriter::SDOXMLFileWriter(const char* xmlFile, DataFactoryPtr dataFactory) + : SDOXMLWriter(dataFactory) + { + setWriter(xmlNewTextWriterFilename(xmlFile, 0)); + } + + SDOXMLFileWriter::~SDOXMLFileWriter() + { + + } + + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLFileWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLFileWriter.h new file mode 100644 index 0000000000..cddfb41293 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLFileWriter.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SDOXMLFILEWRITER_H_ +#define _SDOXMLFILEWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLWriter.h" + + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXMLFileWriter extends SDOXMLWriter and writes a file. + */ + class SDOXMLFileWriter : public SDOXMLWriter + { + + public: + + SDOXMLFileWriter(const char* xmlFile, DataFactoryPtr dataFactory = NULL); + + virtual ~SDOXMLFileWriter(); + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXMLFILEWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLStreamWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLStreamWriter.cpp new file mode 100644 index 0000000000..00d76b1b6e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLStreamWriter.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#include "commonj/sdo/SDOXMLStreamWriter.h" +#include <sstream> + +namespace commonj +{ + namespace sdo + { + + + + + SDOXMLStreamWriter::SDOXMLStreamWriter(std::ostream& outXML, DataFactoryPtr dataFactory) + : SDOXMLBufferWriter(dataFactory), outXmlStream(outXML) + { + } + + SDOXMLStreamWriter::~SDOXMLStreamWriter() + { + } + + int SDOXMLStreamWriter::write(XMLDocumentPtr doc, int indent) + { + int rc = SDOXMLBufferWriter::write(doc, indent); + + // Now stream the buffer + outXmlStream << getBuffer(); + return rc; + } + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLStreamWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLStreamWriter.h new file mode 100644 index 0000000000..92bbfa3cf0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLStreamWriter.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#ifndef _SDOXMLSTREAMWRITER_H_ +#define _SDOXMLSTREAMWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXMLBufferWriter.h" +#include <iostream> + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXMLStreamWriter extends SDOXMLWriter and writes a stream. + */ + class SDOXMLStreamWriter : public SDOXMLBufferWriter + { + + public: + + SDOXMLStreamWriter(std::ostream& outXML, DataFactoryPtr dataFactory = NULL); + virtual ~SDOXMLStreamWriter(); + + int write(XMLDocumentPtr doc, int indent = -1); + private: + std::ostream& outXmlStream; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXMLSTREAMWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLString.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLString.cpp new file mode 100644 index 0000000000..248df58a7f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLString.cpp @@ -0,0 +1,223 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/01/23 16:39:24 $ */ + +#include "commonj/sdo/SDOXMLString.h" +#include <iostream> +#include "libxml/globals.h" + +#include <ctype.h> + +namespace commonj +{ + namespace sdo + { + + SDOXMLString::SDOXMLString() + : xmlForm(0) + { + } + + SDOXMLString::SDOXMLString(const xmlChar* xmlString) + { + xmlForm = xmlStrdup(xmlString); + } + + SDOXMLString::SDOXMLString(const char* localString) + { + xmlForm = xmlCharStrdup(localString); + } + + SDOXMLString::SDOXMLString(const SDOXMLString& str) + { + xmlForm = xmlStrdup(str.xmlForm); + } + + SDOXMLString::SDOXMLString(const xmlChar* str, int start, int len) + { + xmlForm = xmlStrsub(str, start, len); + } + + SDOXMLString& SDOXMLString::operator=(const SDOXMLString& str) + { + if (this != &str) + { + release(); + xmlForm = xmlStrdup(str.xmlForm); + } + return *this; + } + + SDOXMLString SDOXMLString::operator+(const SDOXMLString& str) const + { + xmlChar* newString = xmlStrncatNew(xmlForm, str.xmlForm, xmlStrlen(str.xmlForm)); + SDOXMLString retString(newString); + if (newString) + xmlFree(newString); + return retString; + } + + SDOXMLString& SDOXMLString::operator+=(const SDOXMLString& str) + { + xmlForm = xmlStrncat(xmlForm, str.xmlForm, xmlStrlen(str.xmlForm)); + return *this; + } + + SDOXMLString::~SDOXMLString() + { + release(); + } + + void SDOXMLString::release() + { + if (xmlForm) + xmlFree((void*)xmlForm); + } + + bool SDOXMLString::operator< (const SDOXMLString& str) const + { + if (xmlStrcmp(xmlForm, str.xmlForm) <0) + return true; + else + return false; + } + + bool SDOXMLString::operator==(const SDOXMLString& str) const + { + if (xmlStrEqual(xmlForm, str.xmlForm)) + return true; + else + return false; + } + + bool SDOXMLString::equals(const SDOXMLString& str) const + { + return equals(str.xmlForm); + } + + bool SDOXMLString::equals(const char* localString) const + { + return equals(SDOXMLString(localString)); + } + + + bool SDOXMLString::equals(const xmlChar* xmlString) const + { + if (xmlStrEqual(xmlForm, xmlString)) + return true; + else + return false; + } + + bool SDOXMLString::equalsIgnoreCase(const SDOXMLString& str) const + { + return equalsIgnoreCase(str.xmlForm); + } + + bool SDOXMLString::equalsIgnoreCase(const char* localString) const + { + return equalsIgnoreCase(SDOXMLString(localString)); + } + + + bool SDOXMLString::equalsIgnoreCase(const xmlChar* xmlString) const + { + if (xmlStrcasecmp(xmlForm, xmlString) == 0) + return true; + else + return false; + } + + + std::ostream& operator<<(std::ostream& output, const SDOXMLString& str) + { + if (str.xmlForm) + output << str.xmlForm; + return output; + } + + bool SDOXMLString::isNull() const + { + if (xmlForm) + return false; + else + return true; + } + + SDOXMLString SDOXMLString::toLower(unsigned int start, unsigned int length) + { + char* newString = new char[strlen(*this)+1]; + strcpy(newString, *this); + for (int i = start; (i<=(strlen(newString)) && i < length); i++) + { + newString[i] = tolower(newString[i]); + } + SDOXMLString retString(newString); + delete newString; + return retString; + } + + int SDOXMLString::firstIndexOf(const char ch) const + { + const xmlChar* loc = xmlStrchr(xmlForm, ch); + if (loc == 0) + { + return -1; + } + + return int(loc-xmlForm); + } + + int SDOXMLString::lastIndexOf(const char ch) const + { + const xmlChar* index = 0; + const xmlChar* loc = xmlStrchr(xmlForm, ch); + while (loc !=0) + { + index = loc; + loc = xmlStrchr(loc+1, ch); + } + + if (index == 0) + return -1; + + return int(index-xmlForm); + } + + SDOXMLString SDOXMLString::substring(int start, int length) const + { + if (length >0) + { + return xmlStrsub(xmlForm, start, length); + } + else + return SDOXMLString(); + } + + SDOXMLString SDOXMLString::substring(int start) const + { + + return xmlStrsub(xmlForm, start, xmlStrlen(xmlForm) - start); + } + + + } // End - namespace sdo +} // End - namespace commonj + + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLString.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLString.h new file mode 100644 index 0000000000..9cbf48be1d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLString.h @@ -0,0 +1,91 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/disable_warn.h" + +#ifndef _SDOXMLString_H_ +#define _SDOXMLString_H_ +#include "commonj/sdo/export.h" + +#include <libxml/xmlstring.h> +#include <iostream> + +namespace commonj +{ + namespace sdo + { + /** + * SDOXMLString - utility class for string handling. + * Keeps the string handling local to one place, so we can + * replace it with a more NLS friendly version later. + * Many places within the core should use this too instead + * of allocated char* buffers. (DataObject etc...) + */ + + class SDOXMLString + { + public: + SDO_SPI SDOXMLString(); + SDO_SPI SDOXMLString(const xmlChar* xmlString); + SDO_SPI SDOXMLString(const char* localString); + SDO_SPI SDOXMLString(const SDOXMLString& str); + SDO_SPI SDOXMLString(const xmlChar* str, int start, int len); + SDO_SPI virtual ~SDOXMLString(); + + SDO_SPI SDOXMLString& operator=(const SDOXMLString& str); + SDO_SPI SDOXMLString operator+(const SDOXMLString& str) const; + SDO_SPI SDOXMLString& operator+=(const SDOXMLString& str); + + + SDO_SPI bool operator== (const SDOXMLString& str) const; + SDO_SPI bool equals(const xmlChar* xmlString) const; + SDO_SPI bool equals(const char* localString) const; + SDO_SPI bool equals(const SDOXMLString& str) const; + SDO_SPI bool equalsIgnoreCase(const xmlChar* xmlString) const; + SDO_SPI bool equalsIgnoreCase(const char* localString) const; + SDO_SPI bool equalsIgnoreCase(const SDOXMLString& str) const; + + SDO_SPI bool operator< (const SDOXMLString& str) const; + + SDO_SPI operator const char*() const {return (const char*) xmlForm;} + SDO_SPI operator const xmlChar*() const {return xmlForm;} + + SDO_SPI friend std::ostream& operator<<(std::ostream& output, const SDOXMLString& str); + + SDO_SPI bool isNull() const; + + SDO_SPI SDOXMLString toLower( + unsigned int start = 0, + unsigned int length = 0); + + + SDO_SPI int firstIndexOf(const char ch) const; + SDO_SPI int lastIndexOf(const char ch) const; + SDO_SPI SDOXMLString substring(int start, int length) const; + SDO_SPI SDOXMLString substring(int start) const; + private : + xmlChar* xmlForm; + void release(); + }; + } // End - namespace sdo +} // End - namespace commonj + + + +#endif // _SDOXMLString_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp new file mode 100644 index 0000000000..baf3a762cb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp @@ -0,0 +1,1171 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/03/07 15:35:56 $ */ + +#include "commonj/sdo/SDOXMLWriter.h" +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/SDOString.h" +#include "iostream" +using namespace::std; +#include "commonj/sdo/DASProperty.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/XSDTypeInfo.h" +#include "commonj/sdo/ChangeSummary.h" +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/XMLQName.h" +#include "commonj/sdo/DataObjectImpl.h" + +namespace commonj +{ + namespace sdo + { + + + + + SDOXMLWriter::SDOXMLWriter( + DataFactoryPtr dataFact) + : dataFactory(dataFact) + { + + } + + SDOXMLWriter::~SDOXMLWriter() + { + freeWriter(); + } + + void SDOXMLWriter::setWriter(xmlTextWriterPtr textWriter) + { + writer = textWriter; + } + + void SDOXMLWriter::freeWriter() + { + if (writer != NULL) + { + xmlFreeTextWriter(writer); + writer = NULL; + } + } + + int SDOXMLWriter::write(XMLDocumentPtr doc, int indent) + { + if (!doc) + { + return 0; + } + + if (writer == NULL) + { + // Throw exception + return -1; + } + + int rc = 0; + + //namespaceUriStack.empty(); + //namespaceUriStack.push(SDOXMLString()); + //namespaces.empty(); + //namespaceStack.push(namespaces); + namespaceMap.empty(); + + if (indent >= 0) + { + xmlTextWriterSetIndent(writer, 1); + if (indent > 0) + { + char * chars = new char[indent+1]; + for (int i=0;i<indent;i++)chars[i] = ' '; + chars[indent] = 0; + xmlTextWriterSetIndentString(writer, SDOXMLString(chars)); + delete chars; + } + else + { + xmlTextWriterSetIndentString(writer, SDOXMLString("")); + } + } + + if (doc->getXMLDeclaration()) + { + rc = xmlTextWriterStartDocument(writer, doc->getXMLVersion(), doc->getEncoding(), NULL); + if (rc < 0) { + SDO_THROW_EXCEPTION("write", SDOXMLParserException, "xmlTextWriterStartDocument failed"); + } + } + + DataObjectPtr root = doc->getRootDataObject(); + if (root) + { + bool writeXSIType = false; + // For the root DataObject we need to determine the element name + SDOXMLString elementURI = doc->getRootElementURI(); + if (elementURI.isNull() || elementURI.equals("")) + { + elementURI = root->getType().getURI(); + } + SDOXMLString elementName = doc->getRootElementName(); + if (elementName.isNull() || elementName.equals("")) + { + elementName = root->getType().getName(); + elementName = elementName.toLower(0,1); + writeXSIType = true; + } + + writeDO(root, elementURI, elementName, true, true); + } + rc = xmlTextWriterEndDocument(writer); + if (rc < 0) { + SDO_THROW_EXCEPTION("write", SDOXMLParserException, "xmlTextWriterEndDocument failed"); + return rc; + } + + xmlTextWriterFlush(writer); + freeWriter(); + + return rc; + } + + ////////////////////////////////////////////////////////////////////////// + // Write Change Summary attributes + ////////////////////////////////////////////////////////////////////////// + + void SDOXMLWriter::handleChangeSummaryAttributes( + ChangeSummaryPtr cs, + DataObjectPtr dol) + { + int rc; + + SettingList& sl = cs->getOldValues(dol); + if (sl.size() == 0) + { + // no attributes + return; + } + for (int j=0;j< sl.size(); j++) + { + try { + + if (sl.get(j)->getProperty().isMany()) + { + // manys are elements + continue; + } + + if (sl.get(j)->getProperty().getType().isDataType()) + { + // data types are OK + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString(sl.get(j)->getProperty().getName()), + SDOXMLString(sl.get(j)->getCStringValue())); + } + else + { + DataObjectPtr dob = sl.get(j)->getDataObjectValue(); + if (dob) + { + if (cs->isDeleted(dob)) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString(sl.get(j)->getProperty().getName()), + SDOXMLString(cs->getOldXpath(dob))); + } + else + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString(sl.get(j)->getProperty().getName()), + SDOXMLString(dob->objectToXPath())); + } + } + else + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString(sl.get(j)->getProperty().getName()), + SDOXMLString("")); + } + } + } + catch (SDORuntimeException e) + { + // ignore this attribute + } + } + } + + ////////////////////////////////////////////////////////////////////////// + // Write Change Summary elements + ////////////////////////////////////////////////////////////////////////// + + void SDOXMLWriter::handleChangeSummaryElements( + ChangeSummaryPtr cs, + DataObjectPtr dob) + { + int rc; + + SettingList& sl = cs->getOldValues(dob); + + if (sl.size() == 0) + { + // there are no setting for this element. + return; + } + + for (int j=0;j< sl.size(); j++) + { + try + { + + // single values will have been covered by the attributes. + if (!sl.get(j)->getProperty().isMany()) continue; + + if (sl.get(j)->getProperty().getType().isDataType()) + { + + rc = xmlTextWriterWriteElement( + writer, + SDOXMLString(sl.get(j)->getProperty().getName()), + SDOXMLString(sl.get(j)->getCStringValue())); + + } // if datatype + else + { + DataObjectPtr dob2 = sl.get(j)->getDataObjectValue(); + if (!dob2) + { + continue; + } + if (cs->isDeleted(dob2)) + { + handleChangeSummaryDeletedObject(sl.get(j)->getProperty().getName(), cs,dob2); + } + else + { + rc = xmlTextWriterStartElement( + writer, + SDOXMLString(sl.get(j)->getProperty().getName())); + rc = xmlTextWriterWriteAttribute( + writer, + SDOXMLString("sdo:ref"), + SDOXMLString(dob2->objectToXPath())); + rc = xmlTextWriterEndElement( + writer); + } + } + } + catch (SDORuntimeException e) + { + // ignore this element + } + } // for + } + + + ////////////////////////////////////////////////////////////////////////// + // Write a deleted object and all its props + ////////////////////////////////////////////////////////////////////////// + + void SDOXMLWriter::handleChangeSummaryDeletedObject( + const char* name, + ChangeSummaryPtr cs, + DataObjectPtr dob) + { + + int rc, k; // TODO error handling + + SettingList& sl = cs->getOldValues(dob); + + rc = xmlTextWriterStartElement( + writer, + SDOXMLString(name)); + + if (sl.size() == 0) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdo:ref"), + SDOXMLString(cs->getOldXpath(dob))); + rc = xmlTextWriterEndElement(writer); + return; + } + + + try + { + // print single valued datatypes as attributes + + for (int j=0;j< sl.size(); j++) + { + //if (!sl.get(j)->isSet()) + //{ + // // unset properties dont need recording - ah but they do! + // + // continue; + //} + if ( sl.get(j)->getProperty().isMany()) + { + // manys are elements + continue; + } + if (!sl.get(j)->getProperty().getType().isDataType()) + { + // data objects are element in a deleted data object. + continue; + } + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString(sl.get(j)->getProperty().getName()), + SDOXMLString(sl.get(j)->getCStringValue())); + + } // for attributes + + + // now we are onto the many-values, + // and dataobject single values. + // + // handle deletions within deletions in reverse order, so they match the + // deletion records above. + + for (k=sl.size()-1;k>=0; k--) + { + + if ( !sl.get(k)->getProperty().getType().isDataType() && + sl.get(k)->getProperty().isMany()) + { + // its a dataobject type + DataObjectPtr dob2 = sl.get(k)->getDataObjectValue(); + if (!dob2) continue; + if (!cs->isDeleted(dob2)) continue; + handleChangeSummaryDeletedObject(sl.get(k)-> + getProperty().getName(),cs,dob2); + } + } // for attributes + + for (k=0;k< sl.size(); k++) + { + + if ( !sl.get(k)->getProperty().getType().isDataType()) + { + if (sl.get(k)->getProperty().isMany()) continue; + // its a single valued dataobject type + + DataObjectPtr dob2 = sl.get(k)->getDataObjectValue(); + if (!dob2) continue; + if (!cs->isDeleted(dob2)) continue; + handleChangeSummaryDeletedObject(sl.get(k)-> + getProperty().getName(),cs,dob2); + + } + else + { + if ( !sl.get(k)->getProperty().isMany()) continue; + + // could only be many valued data type + + rc = xmlTextWriterWriteElement(writer, + SDOXMLString(sl.get(k)->getProperty().getName()), + SDOXMLString(sl.get(k)->getCStringValue())); + } + } // for attributes + } + catch (SDORuntimeException e) + { + // ignore - and write the end-element + } + + rc = xmlTextWriterEndElement(writer); + } + + + ////////////////////////////////////////////////////////////////////////// + // Write the list of elements of a change summary + ////////////////////////////////////////////////////////////////////////// + + void SDOXMLWriter::handleSummaryChange( + const SDOXMLString& elementName, + ChangeSummaryPtr cs, + DataObjectPtr dob) + { + int rc; + DataObject* temp = dob; + const char* name; + try + { + name = temp->getContainmentProperty().getName(); + } + catch (SDORuntimeException e) + { + // This could be a root, and have no name. + name = 0; + } + + if (name == 0) + { + rc = xmlTextWriterStartElement( + writer, + elementName); + } + else + { + rc = xmlTextWriterStartElement( + writer, + SDOXMLString(name)); + } + + if (rc != 0) + { + // failed to write an element + return; + } + + try + { + name = temp->objectToXPath(); + } + catch (SDORuntimeException e) + { + name = 0; + } + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdo:ref"), + SDOXMLString(name)); + + handleChangeSummaryAttributes(cs, temp); + + handleChangeSummaryElements(cs, temp); + + rc = xmlTextWriterEndElement(writer); + + } + + ////////////////////////////////////////////////////////////////////////// + // Write a Change Summary + ////////////////////////////////////////////////////////////////////////// + + void SDOXMLWriter::handleChangeSummary( + const SDOXMLString& elementName, + ChangeSummaryPtr cs) + { + int i; + int rc; + + ChangedDataObjectList& changedDOs = cs->getChangedDataObjects(); + rc = xmlTextWriterStartElementNS(writer, + SDOXMLString("sdo"), SDOXMLString("changeSummary"), SDOXMLString(Type::SDOTypeNamespaceURI.c_str())); + if (rc != 0) return; + if (cs->isLogging()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("logging"), + SDOXMLString("true")); + } + + if (changedDOs.size() > 0) + { + + // write the creates/deletes in the order they + // happened, as elements. + + for (i=0;i< changedDOs.size();i++) + { + if (cs->isCreated(changedDOs[i]) + && changedDOs.getType(i) == ChangedDataObjectList::Create) + { + // TODO - should work out if theres a IDREF here + // TODO - can we have more than one create like this? + try + { + rc = xmlTextWriterWriteElement(writer, + SDOXMLString("create"), + SDOXMLString(changedDOs[i]->objectToXPath())); + } + catch (SDORuntimeException e) + { + // The object was not in our tree - we ignore it. + } + } + if (cs->isDeleted(changedDOs[i]) + && changedDOs.getType(i) == ChangedDataObjectList::Delete) + { + // TODO - should work out if theres a IDREF here + try + { + rc = xmlTextWriterWriteElement(writer, + SDOXMLString("delete"), + SDOXMLString(cs->getOldXpath(changedDOs[i]))); + } + catch (SDORuntimeException e) + { + // The object was not in the deleted list - we ignore it. + } + } + } + + + for (i=0;i< changedDOs.size();i++) + { + if (cs->isModified(changedDOs[i])) + { + handleSummaryChange(elementName, cs, changedDOs[i]); + } + } + + } + rc = xmlTextWriterEndElement(writer); + } + + ////////////////////////////////////////////////////////////////////////// + // Add to namespaces + ////////////////////////////////////////////////////////////////////////// + + void SDOXMLWriter::addToNamespaces(DataObjectImpl* dob) + { + std::map<SDOXMLString,SDOXMLString>::iterator it; + SDOXMLString uri = dob->getType().getURI(); + + it = namespaceMap.find(uri); + if (it == namespaceMap.end()) + { + char buf[20]; + sprintf(buf,"%d",++spacescount); + SDOXMLString s = SDOXMLString("tns") + buf; + namespaceMap.insert(make_pair(uri,s)); + } + + PropertyList pl = dob->getInstanceProperties(); + for (int i = 0; i < pl.size(); i++) + { + if (!dob->isSet(pl[i]))continue; + + if (pl[i].isMany()) + { + if (!pl[i].getType().isDataType()) + { + DataObjectList& dl = dob->getList(pl[i]); + for (int k=0;k< dl.size() ;k++) + { + DataObjectImpl* d = (DataObjectImpl*)(DataObject*)dl[k]; + if (d != 0)addToNamespaces(d); + } + } + } + else + { + if (!pl[i].getType().isDataType()) + { + DataObjectImpl* d = (DataObjectImpl*)(DataObject*)dob->getDataObject(pl[i]); + if (d != 0)addToNamespaces(d); + } + else + { + XSDPropertyInfo* pi = getPropertyInfo(dob->getType(), pl[i]); + if (pi) + { + PropertyDefinitionImpl propdef; + propdef = pi->getPropertyDefinition(); + if (propdef.isElement)continue; + if (!propdef.isQName)continue; + + SDOXMLString propertyValue = (dob->getCString(pl[i])); + XMLQName qname(propertyValue); + + it = namespaceMap.find(qname.getURI()); + if (it == namespaceMap.end()) + { + char buf[20]; + sprintf(buf,"%d",++spacescount); + SDOXMLString s = SDOXMLString("tns") + buf; + namespaceMap.insert(make_pair(qname.getURI(),s)); + } + } + } + } + } + } + + + + + ////////////////////////////////////////////////////////////////////////// + // Write a DatObject tree + ////////////////////////////////////////////////////////////////////////// + + int SDOXMLWriter::writeDO( + DataObjectPtr dataObject, + const SDOXMLString& elementURI, + const SDOXMLString& elementName, + bool writeXSIType, + bool isRoot) + { + + int rc; + + if (dataObject == 0) + return 0; + + + //SDOXMLString uri; + //if (!elementURI.equals(namespaceUriStack.top())) + //{ + // uri = elementURI; + // namespaceUriStack.push(elementURI); + //} + + const Type& dataObjectType = dataObject->getType(); + + ////////////////////////////////////////////////////////////////////////// + // suppose its a primitive type - just write the value + ////////////////////////////////////////////////////////////////////////// + if (dataObjectType.isDataType()) + { + if (dataObject->isNull("")) + { + rc = xmlTextWriterStartElementNS(writer, + NULL, elementName, elementURI); + if (rc < 0) + { + SDO_THROW_EXCEPTION("writeDO", + SDOXMLParserException, + "xmlTextWriterStartElementNS failed"); + } + rc = xmlTextWriterWriteAttribute(writer, + (const unsigned char*)"xsi:nil", + (const unsigned char*)"true"); + rc = xmlTextWriterEndElement(writer); + } + else + { + xmlTextWriterWriteElement( + writer, + elementName, + SDOXMLString(dataObject->getCString(""))); + } + + // need to pop stacks before returning + //if (!uri.isNull()) + //{ + // namespaceUriStack.pop(); + //} + return 0; + + } + + + //namespaceStack.push(namespaces); + + + if (isRoot) + { + tnsURI=elementURI; + if (elementURI.equals("")) { + rc = xmlTextWriterStartElementNS(writer, NULL, elementName, NULL); + } + else + { + rc = xmlTextWriterStartElementNS(writer, NULL, elementName, elementURI); + } + if (rc < 0) { + SDO_THROW_EXCEPTION("writeDO", SDOXMLParserException, "xmlTextWriterStartElementNS failed"); + } + } + else + { + //xmlTextWriterWriteString(writer,SDOXMLString("\n")); + + SDOXMLString theName=elementName; + + if (!elementURI.isNull() && !elementURI.equals(tnsURI) && !elementURI.equals("")) + { + std::map<SDOXMLString,SDOXMLString>::iterator it = namespaceMap.find(elementURI); + if (it != namespaceMap.end()) + { + theName = (*it).second; + theName += ":"; + theName += elementName; + } + } + + rc = xmlTextWriterStartElementNS(writer, NULL, theName, NULL); + if (rc < 0) { + SDO_THROW_EXCEPTION("writeDO", SDOXMLParserException, "xmlTextWriterStartElementNS failed"); + } + } + + + if (writeXSIType) + { + rc = xmlTextWriterWriteAttributeNS(writer, + SDOXMLString("xsi"), SDOXMLString("type"), + NULL, + /*SDOXMLString("http://www.w3.org/2001/XMLSchema-instance"),*/ + SDOXMLString(dataObject->getType().getName())); + if (isRoot) + { + namespaceMap.insert(make_pair( + SDOXMLString("http://www.w3.org/2001/XMLSchema-instance"), + SDOXMLString("xsi"))); + + } + } + + + if (isRoot) + { + std::map<SDOXMLString,SDOXMLString>::iterator it = namespaceMap.find(elementURI); + if (it == namespaceMap.end()) + { + SDOXMLString s = SDOXMLString("tns"); + namespaceMap.insert(make_pair(elementURI,s)); + } + DataObjectImpl* d = (DataObjectImpl*)(DataObject*)dataObject; + spacescount = 1; + addToNamespaces(d); + +///////////////////////////////////////////////////////////////////////////////////// +// // build the namespace map, and write the items out at the +// // top of the tree. +// int spacecount = 0; +// DataObjectImpl* d = (DataObjectImpl*)(DataObject*)dataObject; +// if (d != 0) +// { +// TypeList types = (d->getDataFactory())->getTypes(); +// std::map<SDOXMLString,SDOXMLString>::iterator it; +// +// for (int i = 0; i<types.size(); i++) +// { +// SDOXMLString uri = types[i].getURI(); +// if (uri.equals(Type::SDOTypeNamespaceURI)) continue; +// std::map<SDOXMLString,SDOXMLString>::iterator it = namespaceMap.find(uri); +// if (it == namespaceMap.end()) +// { +// char buf[4]; +// if (!elementURI.isNull()) +// { +// if (elementURI.equals(uri)) +// { +// SDOXMLString s = SDOXMLString("tns"); +// namespaceMap.insert(make_pair(uri,s)); +// } +// else +// { +// sprintf(buf,"%d",++spacecount); +// SDOXMLString s = SDOXMLString("tns") + buf; +// namespaceMap.insert(make_pair(uri,s)); +// } +// } +// } +// } +//////////////////////////////////////////////////////////////////////////////////// + + for (it = namespaceMap.begin();it != namespaceMap.end(); ++it) + { + if ((*it).first.equals("")) continue; + SDOXMLString space = SDOXMLString("xmlns:") + (*it).second; + rc = xmlTextWriterWriteAttribute(writer, + space, (*it).first); + } + } + + + ////////////////////////////////////////////////////////////////////////// + // write out the type if the xsi:type if the containing type is open + // and the property is not one of the declared properties + ////////////////////////////////////////////////////////////////////////// + DataObject* dob = dataObject; + DataObjectImpl* cont = + ((DataObjectImpl*)dob)->getContainerImpl(); + if (cont != 0) + { + if (cont->getType().isOpenType()) + { + //if (dataObject->getType().getURI() != 0) + //{ + // std::string value = + // dataObject->getType().getURI(); + // value += ":"; + // value += dataObject->getType().getName(); + // rc = xmlTextWriterWriteAttribute(writer, + // (const unsigned char*)"xsi:type", + // (const unsigned char*)value.c_str()); + //} + //else + //{ + if (cont->getTypeImpl().getPropertyImpl(elementName) == 0) + { + rc = xmlTextWriterWriteAttribute(writer, + (const unsigned char*)"xsi:type", + (const unsigned char*)dataObject->getType().getName()); + } + } + } + + // write nil if required + if (dataObject->isNull("")) + { + rc = xmlTextWriterWriteAttribute(writer, + (const unsigned char*)"xsi:nil", + (const unsigned char*)"true"); + } + + + ////////////////////////////////////////////////////////////////////////// + // Iterate over all the properties to find attributes + ////////////////////////////////////////////////////////////////////////// + int i; + int j = 1; + PropertyList pl = dataObject->getInstanceProperties(); + for (i = 0; i < pl.size(); i++) + { + if (dataObject->isSet(pl[i])) + { + SDOXMLString propertyName(pl[i].getName()); + XSDPropertyInfo* pi = getPropertyInfo(dataObjectType, pl[i]); + PropertyDefinitionImpl propdef; + if (pi) + { + propdef = pi->getPropertyDefinition(); + propertyName = propdef.localname; + } + + // Elements are written as <element> + if (propdef.isElement) + continue; + + // Many-valued properties are written as <element> + if (pl[i].isMany()) + continue; + + // if (pl[i].isContainment()) + // continue; + + ////////////////////////////////////////////////////////////////////// + // Non contained properties become attributes + ////////////////////////////////////////////////////////////////////// + const Type& propertyType = pl[i].getType(); + + if (propertyType.isDataType()) + { + SDOXMLString propertyValue = (dataObject->getCString(pl[i])); + if (pi && pi->getPropertyDefinition().isQName) + { + XMLQName qname(propertyValue); + + //{ + //const SDOXMLString* prefix = namespaces.findPrefix(qname.getURI()); + //if (prefix == 0) + //{ + // char buffer[100]; + // SDOXMLString pref = "tns"; + // sprintf(buffer, "%d", i); + // pref += buffer; + // namespaces.add(pref, qname.getURI()); + // prefix = namespaces.findPrefix(qname.getURI()); + //} + + //if (prefix != 0 && !(*prefix).equals("")) + + std::map<SDOXMLString,SDOXMLString>::iterator it = namespaceMap.find(qname.getURI()); + if (it != namespaceMap.end()) + { + propertyValue = (*it).second + ":" + qname.getLocalName(); + } + else + { + char buffer[20]; + SDOXMLString pref = "tnss"; + sprintf(buffer, "%d", j++); + pref += buffer; + rc = xmlTextWriterWriteAttributeNS(writer, + SDOXMLString("xmlns"), pref, NULL, qname.getURI()); + propertyValue = pref + ":" + qname.getLocalName(); + } + + } + rc = xmlTextWriterWriteAttribute(writer, + propertyName, propertyValue); + } + else + { + // Handle non-containment reference to DataObject + if (pl[i].isReference()) + { + writeReference(dataObject, pl[i], false); + } + } + } + } + + // -------------------- + // Handle ChangeSummary + // -------------------- + if (dataObject->getType().isChangeSummaryType()) + { + ChangeSummaryPtr changeSummary = dataObject->getChangeSummary(); + if (changeSummary) + { + handleChangeSummary(elementName, changeSummary); + } + } + + if (dataObjectType.isSequencedType()) + { + SequencePtr sequence = dataObject->getSequence(); + if (sequence) + { + for (i=0; i<sequence->size(); i++) + { + + if (sequence->isText(i)) + { + rc = xmlTextWriterWriteString( + writer, + SDOXMLString(sequence->getCStringValue(i))); + continue; + } // end TextType + + const Property& seqProp = sequence->getProperty(i); + SDOXMLString seqPropName = seqProp.getName(); + const Type& seqPropType = seqProp.getType(); + + if (seqPropType.isDataObjectType()) + { + DataObjectPtr doValue; + if (seqProp.isMany()) + { + int index = sequence->getListIndex(i); + doValue = dataObject->getList(seqProp)[index]; + } + else + { + doValue = dataObject->getDataObject(seqProp); + } + + if (doValue) + { + // Handle non-containment reference to DataObject + if (seqProp.isReference()) + { + writeReference(dataObject, seqProp, true, doValue); + } + else + { + writeDO(doValue, doValue->getType().getURI(), seqPropName); + } + } + } // end DataObject + + + else + { + // Sequence member is a primitive + xmlTextWriterWriteElement( + writer, + seqPropName, + SDOXMLString(sequence->getCStringValue(i))); + + } // end DataType + } // end - iterate over sequence + + } + + } // end sequence handling + + else + { + + ////////////////////////////////////////////////////////////////////////// + // Iterate over all the properties to find elements + ////////////////////////////////////////////////////////////////////////// + for (i = 0; i < pl.size(); i++) + { + if (dataObject->isSet(pl[i])) + { + + SDOXMLString propertyName(pl[i].getName()); + XSDPropertyInfo* pi = getPropertyInfo(dataObjectType, pl[i]); + if (pi) + { + if (!pi->getPropertyDefinition().isElement) + continue; + propertyName = pi->getPropertyDefinition().localname; + } + + const Type& propertyType = pl[i].getType(); + + ////////////////////////////////////////////////////////////////////// + // For a many-valued property get the list of values + ////////////////////////////////////////////////////////////////////// + if (pl[i].isMany()) + { + DataObjectList& dol = dataObject->getList(pl[i]); + for (int j = 0; j <dol.size(); j++) + { + // Handle non-containment reference to DataObject + if (pl[i].isReference() ) + { + writeReference(dataObject, pl[i], true, dol[j]); + } + else + { + SDOXMLString typeURI = dol[j]->getType().getURI(); + writeDO(dol[j], dol[j]->getType().getURI(), propertyName); + } + } + } // end IsMany + + ////////////////////////////////////////////////////////////////////// + // For a dataobject write the do + ////////////////////////////////////////////////////////////////////// + else if (!propertyType.isDataType()) + { + // Handle non-containment reference to DataObject + if (pl[i].isReference()) + { + if (pi) + writeReference(dataObject, pl[i], true); + } + else + { + DataObjectPtr propDO = dataObject->getDataObject(pl[i]); + writeDO(propDO, propDO->getType().getURI(), propertyName); + } + } + + ////////////////////////////////////////////////////////////////////// + // For a primitive + ////////////////////////////////////////////////////////////////////// + else + { + // Only write a primitive as an element if defined by the XSD + if (pi) + { + const Type& tp = dataObject->getType(); + XSDTypeInfo* typeInfo = (XSDTypeInfo*) + ((DASType*)&tp)->getDASValue("XMLDAS::TypeInfo"); + if (typeInfo && typeInfo->getTypeDefinition().isExtendedPrimitive) + { + xmlTextWriterWriteRaw( + writer, + SDOXMLString(dataObject->getCString(pl[i]))); + } + else + { + if (dataObject->isNull(pl[i])) + { + rc = xmlTextWriterStartElementNS(writer, + NULL, elementName, elementURI); + if (rc < 0) + { + SDO_THROW_EXCEPTION("writeDO", + SDOXMLParserException, + "xmlTextWriterStartElementNS failed"); + } + rc = xmlTextWriterWriteAttribute(writer, + (const unsigned char*)"xsi:nil", + (const unsigned char*)"true"); + rc = xmlTextWriterEndElement(writer); + } + else + { + xmlTextWriterWriteElement( + writer, + propertyName, + SDOXMLString(dataObject->getCString(pl[i]))); + } + } + } + } + } + } + } + rc = xmlTextWriterEndElement(writer); + return rc; + + //namespaces = namespaceStack.top(); + //namespaceStack.pop(); + //if (!uri.isNull()) + //{ + // namespaceUriStack.pop(); + //} + } + + XSDPropertyInfo* SDOXMLWriter::getPropertyInfo(const Type& type, const Property& property) + { + if (dataFactory) + { + return (XSDPropertyInfo*)dataFactory->getDASValue(type, property.getName(), "XMLDAS::PropertyInfo"); + } + else + { + return (XSDPropertyInfo*)((DASProperty*)&property)->getDASValue("XMLDAS::PropertyInfo"); + } + + } + + void SDOXMLWriter::writeReference( + DataObjectPtr dataObject, + const Property& property, + bool isElement, + DataObjectPtr refferedToObject) + { + DataObjectPtr reffedObject = refferedToObject; + if (reffedObject == 0) + { + reffedObject = dataObject->getDataObject(property); + } + + // Get ID from referred to DataObject or use XPath + SDOXMLString refValue; + XSDTypeInfo* ti = (XSDTypeInfo*)((DASType*)&reffedObject->getType())-> + getDASValue("XMLDAS::TypeInfo"); + if (ti) + { + TypeDefinitionImpl typeDef = ti->getTypeDefinition(); + if (!typeDef.IDPropertyName.isNull()) + { + refValue = reffedObject->getCString(typeDef.IDPropertyName); + } + } + + if (refValue.isNull()) + { + // need to get XPATH + refValue = ((DataObjectImpl*)(DataObject*)reffedObject)->objectToXPath(); + } + + if (!refValue.isNull()) + { + if (isElement) + { + // Set the IDREF value + xmlTextWriterWriteElement(writer, + SDOXMLString(property.getName()), refValue); + } + else + { + // Set the IDREF value + xmlTextWriterWriteAttribute(writer, + SDOXMLString(property.getName()), refValue); + } + } + } + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLWriter.h new file mode 100644 index 0000000000..b862a492e1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXMLWriter.h @@ -0,0 +1,117 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 12:53:49 $ */ + +#ifndef _SDOXMLWRITER_H_ +#define _SDOXMLWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include <libxml/xmlwriter.h> +#include "commonj/sdo/XMLDocument.h" +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/SchemaInfo.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include <stack> +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/DataObjectImpl.h" + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXMLWriter writes a data object tree to XML + */ + class SDOXMLWriter + { + + public: + + SDOXMLWriter(DataFactoryPtr dataFactory = NULL); + + virtual ~SDOXMLWriter(); + + int write(XMLDocumentPtr doc, int indent=-1); + + protected: + void setWriter(xmlTextWriterPtr textWriter); + void freeWriter(); + + private: + xmlTextWriterPtr writer; + + void handleChangeSummaryAttributes( + ChangeSummaryPtr cs, + DataObjectPtr doB); + + void handleChangeSummaryElements( + ChangeSummaryPtr cs, + DataObjectPtr dob); + + void handleChangeSummaryDeletedObject( + const char* name, + ChangeSummaryPtr cs, + DataObjectPtr dob); + + void handleSummaryChange( + const SDOXMLString& elementName, + ChangeSummaryPtr cs, + DataObjectPtr dob); + + void handleChangeSummary( + const SDOXMLString& elementName, + ChangeSummaryPtr cs); + + void addToNamespaces(DataObjectImpl* dob); + + int writeDO( + DataObjectPtr dataObject, + const SDOXMLString& elementURI, + const SDOXMLString& elementName, + bool writeXSIType = false, + bool isRoot = false); + + SchemaInfo* schemaInfo; + DataFactoryPtr dataFactory; + + XSDPropertyInfo* getPropertyInfo(const Type& type, const Property& property); + + //std::stack<SDOXMLString> namespaceUriStack; + //SAX2Namespaces namespaces; + //std::stack<SAX2Namespaces> namespaceStack; + int spacescount; + std::map<SDOXMLString,SDOXMLString> namespaceMap; + SDOXMLString tnsURI; + + + void writeReference( + DataObjectPtr dataObject, + const Property& property, + bool isElement, + DataObjectPtr refferedToObject = 0); + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXMLWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDBufferWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDBufferWriter.cpp new file mode 100644 index 0000000000..e92b0eb48e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDBufferWriter.cpp @@ -0,0 +1,53 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SDOXSDBufferWriter.h" +#include "commonj/sdo/SDORuntimeException.h" + +namespace commonj +{ + namespace sdo + { + + + + + SDOXSDBufferWriter::SDOXSDBufferWriter() + { + buf = xmlBufferCreate(); + if (buf == NULL) + { + SDO_THROW_EXCEPTION("SDOXSDBufferWriter", SDOXMLParserException, "xmlBufferCreate failed"); + } + setWriter(xmlNewTextWriterMemory(buf, 0)); + } + + SDOXSDBufferWriter::~SDOXSDBufferWriter() + { + freeWriter(); + xmlBufferFree(buf); + } + + SDOXMLString SDOXSDBufferWriter::getBuffer() + { + freeWriter(); + return xmlBufferContent(buf); + } + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDBufferWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDBufferWriter.h new file mode 100644 index 0000000000..a923c32bd1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDBufferWriter.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SDOXSDBUFFERWRITER_H_ +#define _SDOXSDBUFFERWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXSDWriter.h" + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXSDBufferWriter extends SDOXSDWriter and writes a buffer. + */ + class SDOXSDBufferWriter : public SDOXSDWriter + { + + public: + + SDOXSDBufferWriter(); + virtual ~SDOXSDBufferWriter(); + + SDOXMLString getBuffer(); + private: + xmlBufferPtr buf; + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXSDBUFFERWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDFileWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDFileWriter.cpp new file mode 100644 index 0000000000..e0a5b78de4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDFileWriter.cpp @@ -0,0 +1,43 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SDOXSDFileWriter.h" + +namespace commonj +{ + namespace sdo + { + + + + + SDOXSDFileWriter::SDOXSDFileWriter(const char* xsdFile) + { + setWriter(xmlNewTextWriterFilename(xsdFile, 0)); + } + + SDOXSDFileWriter::~SDOXSDFileWriter() + { + + } + + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDFileWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDFileWriter.h new file mode 100644 index 0000000000..b85b88bbc4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDFileWriter.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SDOXSDFILEWRITER_H_ +#define _SDOXSDFILEWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXSDWriter.h" + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXSDFileWriter extends SDOXSDWriter and writes a file. + */ + class SDOXSDFileWriter : public SDOXSDWriter + { + + public: + + SDOXSDFileWriter(const char* xsdFile); + + virtual ~SDOXSDFileWriter(); + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXSDFILEWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDStreamWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDStreamWriter.cpp new file mode 100644 index 0000000000..664dbe1c6f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDStreamWriter.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#include "commonj/sdo/SDOXSDStreamWriter.h" +#include <sstream> + +namespace commonj +{ + namespace sdo + { + + + + + SDOXSDStreamWriter::SDOXSDStreamWriter(std::ostream& outXML) + : outXmlStream(outXML) + { + } + + SDOXSDStreamWriter::~SDOXSDStreamWriter() + { + } + + int SDOXSDStreamWriter::write(const TypeList& types, const SDOXMLString& targetNamespaceURI, + const propertyMap& openprops, int indent) + { + int rc = SDOXSDBufferWriter::write(types, targetNamespaceURI, openprops, indent); + + // Now stream the buffer + outXmlStream << getBuffer(); + return rc; + } + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDStreamWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDStreamWriter.h new file mode 100644 index 0000000000..5f80536f4d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDStreamWriter.h @@ -0,0 +1,55 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#ifndef _SDOXSDSTREAMWRITER_H_ +#define _SDOXSDSTREAMWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SDOXSDBufferWriter.h" +#include <iostream> + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXSDStreamWriter extends SDOXSDWriter and writes a stream. + */ + class SDOXSDStreamWriter : public SDOXSDBufferWriter + { + + public: + + SDOXSDStreamWriter(std::ostream& outXML); + virtual ~SDOXSDStreamWriter(); + + int write(const TypeList& types, const SDOXMLString& targetNamespaceURI, + const propertyMap& openprops, int indent = -1); + private: + std::ostream& outXmlStream; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXSDSTREAMWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDWriter.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDWriter.cpp new file mode 100644 index 0000000000..d80b6cc9e4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDWriter.cpp @@ -0,0 +1,840 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 12:53:49 $ */ + +#include "commonj/sdo/SDOXSDWriter.h" +#include "iostream" +using namespace::std; +#include "commonj/sdo/DASProperty.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/DataFactoryImpl.h" + +namespace commonj +{ + namespace sdo + { + + + + + SDOXSDWriter::SDOXSDWriter( + DataFactoryPtr dataFact) + : dataFactory(dataFact) + { + + } + + SDOXSDWriter::~SDOXSDWriter() + { + freeWriter(); + } + + void SDOXSDWriter::setWriter(xmlTextWriterPtr textWriter) + { + writer = textWriter; + } + + void SDOXSDWriter::freeWriter() + { + if (writer != NULL) + { + xmlFreeTextWriter(writer); + writer = NULL; + } + } + + + void SDOXSDWriter::writeProps( const propertyMap& pl, const SDOXMLString& targetNamespaceURI, + SDOXMLString& xsd) + { + int rc; + + // ------------------------------------------------------- + // Create <element> definitions + // ------------------------------------------------------- + + propertyMap::const_iterator j; + for (j = pl.begin(); j != pl.end(); ++j) + { + const PropertyImpl& prop = (*j).second; + const Type& propType = prop.getType(); + + + SDOXMLString propTypeName = resolveName(propType.getURI(), + propType.getName(), targetNamespaceURI); + + + if (prop.isMany() || !prop.getType().isDataType()) + { + // ----------------------------- + // Write an <element> definition + // ----------------------------- + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("element"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + SDOXMLString(prop.getName())); + + if (!propType.isDataType() && !prop.isContainment()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdoxml:propertyType"), + propTypeName); + propTypeName = "xsd:anyURI"; + } + + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("type"), + propTypeName); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("minOccurs"), + SDOXMLString("0")); + + if (prop.isMany()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("maxOccurs"), + SDOXMLString("unbounded")); + } + + // End element + rc = xmlTextWriterEndElement(writer); + } + else + { + // ------------------------------- + // Write an <attribute> definition + // ------------------------------- + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("attribute"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + SDOXMLString(prop.getName())); + + if (!propType.isDataType()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdoxml:propertyType"), + propTypeName); + if (prop.isReference()) + { + propTypeName = "xsd:IDREF"; + } + else + { + propTypeName = "xsd:anyURI"; + } + } + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("type"), + propTypeName); + + // End attribute + rc = xmlTextWriterEndElement(writer); + + } // else + } // for + } // method + + + //////////////////////////////////////// + + int SDOXSDWriter::write(const TypeList& types, const SDOXMLString& targetNamespaceURI, + const propertyMap& openprops, int indent) + { + int i; + if (writer == NULL) + { + // Throw exception + return -1; + } + + int rc = 0; + + if (indent >= 0) + { + xmlTextWriterSetIndent(writer, 1); + if (indent > 0) + { + char * chars = new char[indent+1]; + for (int i=0;i<indent;i++)chars[i] = ' '; + chars[indent] = 0; + xmlTextWriterSetIndentString(writer, SDOXMLString(chars)); + delete chars; + } + else + { + xmlTextWriterSetIndentString(writer, SDOXMLString("")); + } + } + + // -------------------------------------------------------------- + // Write the <schema> definition including namespace information + // -------------------------------------------------------------- + SDOXMLString tns; + SDOXMLString xsd("xsd"); + SDOXMLString sdoURI(Type::SDOTypeNamespaceURI.c_str()); + + SDOXMLString schemaURI = "http://www.w3.org/2001/XMLSchema"; + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("schema"), schemaURI); + if (rc < 0) { + SDO_THROW_EXCEPTION("write", SDOXMLParserException, "xmlTextWriterStartElementNS failed"); + } + + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("xmlns:sdo"), + sdoURI); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("xmlns:sdoxml"), + sdoURI + "/xml"); + + // -------------------------------------------------------------- + // Add all namespaces found in type list + // -------------------------------------------------------------- + int spacecount = 0; + + std::map<SDOXMLString,SDOXMLString>::iterator it; + + for (i = 0; i<types.size(); i++) + { + SDOXMLString uri = types[i].getURI(); + if (uri.equals(Type::SDOTypeNamespaceURI.c_str())) continue; + std::map<SDOXMLString,SDOXMLString>::iterator it = namespaceMap.find(uri); + if (it == namespaceMap.end()) + { + char buf[4]; + if (!targetNamespaceURI.isNull() + && !targetNamespaceURI.equals(uri)) + { + sprintf(buf,"%d",++spacecount); + SDOXMLString s = SDOXMLString("tns") + buf; + namespaceMap.insert(make_pair(uri,s)); + } + } + } + + for (it = namespaceMap.begin();it != namespaceMap.end(); ++it) + { + SDOXMLString space = SDOXMLString("xmlns:") + (*it).second; + rc = xmlTextWriterWriteAttribute(writer, + space, (*it).first); + } + + // -------------------------------------------------------------- + // Add targetNamespace if necessary + // -------------------------------------------------------------- + if (!targetNamespaceURI.isNull() && !targetNamespaceURI.equals("")) + { + tns = "tns:"; + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("xmlns:tns"), + targetNamespaceURI); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("targetNamespace"), + targetNamespaceURI); + } + + + // -------------------------------------------------------------- + // Now iterate through the Types creating elements as appropriate + // -------------------------------------------------------------- + for (i = 0; i<types.size(); i++) + { + const Type& type = types[i]; + const Type* baseType = type.getBaseType(); + + // Do not define SDO DataTypes + SDOXMLString uri = type.getURI(); + if (uri.equals(Type::SDOTypeNamespaceURI.c_str())) + continue; + + // Do not define the RootType + SDOXMLString name = type.getName(); + if (uri.equals(targetNamespaceURI) && name.equals("RootType")) + continue; + + + // -------------------------------------------------------------- + // DataTypes become simpleType definitions + // -------------------------------------------------------------- + if (type.isDataType()) + { + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("simpleType"), NULL); + if (rc < 0) { + SDO_THROW_EXCEPTION("write", SDOXMLParserException, "xmlTextWriterStartElementNS failed"); + } + + SDOXMLString typeName; + it = namespaceMap.find(type.getURI()); + if (it != namespaceMap.end() && + !targetNamespaceURI.equals((*it).first)) + { + typeName = (*it).second + ":" + name; + } + else + { + typeName = name; + } + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + typeName); + // -------------------------------------------------------------- + // write any alias. + // -------------------------------------------------------------- + if (type.getAliasCount() > 0) + { + unsigned int j = type.getAliasCount(); + SDOXMLString value = ""; + for (int i=0;i<j-1;i++) + { + value = value + type.getAlias(i); + value = value + " "; + } + value += type.getAlias(j-1); + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdo:aliasName"),value); + + } + + if (baseType != 0) + { + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("restriction"), NULL); + + SDOXMLString baseName = resolveName(baseType->getURI(), baseType->getName(), targetNamespaceURI); + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("base"), + baseName); + + + rc = xmlTextWriterEndElement(writer); + } + rc = xmlTextWriterEndElement(writer); + + } + else + // --------------------------------------------------------------------- + // DataObject Types become ComplexType definitions with a global element + // --------------------------------------------------------------------- + { + rc = xmlTextWriterStartElementNS(writer,xsd, SDOXMLString("element"), NULL); + if (rc < 0) { + SDO_THROW_EXCEPTION("write", SDOXMLParserException, "xmlTextWriterStartElementNS failed"); + } + + SDOXMLString typeName; + it = namespaceMap.find(type.getURI()); + if (it != namespaceMap.end() && + !targetNamespaceURI.equals((*it).first)) + { + typeName = (*it).second + ":" + name; + } + else + { + typeName = name; + } + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + name.toLower(0,1)); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("type"), + typeName); + + rc = xmlTextWriterEndElement(writer); + + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("complexType"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + typeName); + + // ----------------------------------------------------- + // If there is an alias, write it + // ----------------------------------------------------- + if (type.getAliasCount() > 0) + { + unsigned int j = type.getAliasCount(); + SDOXMLString value = ""; + for (int i=0;i<j-1;i++) + { + value = value + type.getAlias(i); + value = value + " "; + } + value += type.getAlias(j-1); + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdo:aliasName"),value); + + } + + // ----------------------------------------------------- + // If there is a base type then we need <complexContent> + // ----------------------------------------------------- + if (baseType != 0) + { + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("complexContent"), NULL); + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("extension"), NULL); + + SDOXMLString baseName = resolveName(baseType->getURI(), baseType->getName(), targetNamespaceURI); + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("base"), + baseName); + + // End extension + rc = xmlTextWriterEndElement(writer); + } + + // --------------------------- + // Iterate over the properties + // --------------------------- + PropertyList pl = type.getProperties(); + + if (pl.size() != 0) + { + bool inSequence = false; + + // ------------------------------------------------------- + // Create <element> definitions + // ------------------------------------------------------- + + int j; + for (j = 0; j < pl.size(); j++) + { + const Property& prop = pl[j]; + const Type& propType = prop.getType(); + + SDOXMLString propTypeName = resolveName(propType.getURI(), + propType.getName(), targetNamespaceURI); + + bool isElement = false; + bool isQName = false; + XSDPropertyInfo* pi = (XSDPropertyInfo*) + ((DASProperty*)&prop)->getDASValue("XMLDAS::PropertyInfo"); + if (pi) + { + PropertyDefinitionImpl propdef = pi->getPropertyDefinition(); + if (propdef.isElement) + isElement=true; + if (propdef.isQName) + isQName=true; + } + + if (prop.isMany() + || prop.isContainment() + || isElement) + { + // ------------------------------------------------- + // Write <sequence> or <choice> before first element + // ------------------------------------------------- + if (!inSequence) + { + if (type.isSequencedType()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("mixed"), + SDOXMLString("true")); + + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("choice"), NULL); + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("maxOccurs"), + SDOXMLString("unbounded")); + } + else + { + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("sequence"), NULL); + } + inSequence = true; + } + // ----------------------------- + // Write an <element> definition + // ----------------------------- + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("element"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + SDOXMLString(prop.getName())); + + if (!propType.isDataType() && !prop.isContainment()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdoxml:propertyType"), + propTypeName); + propTypeName = "xsd:anyURI"; + } + + if (isQName) + { + propTypeName = "xsd:QName"; + } + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("type"), + propTypeName); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("minOccurs"), + SDOXMLString("0")); + + if (prop.isMany()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("maxOccurs"), + SDOXMLString("unbounded")); + } + + // ----------------------------------------------------- + // If there is an alias... + // ----------------------------------------------------- + if (prop.getAliasCount() > 0) + { + unsigned int j = prop.getAliasCount(); + SDOXMLString value = ""; + for (int i=0;i<j-1;i++) + { + value = value + prop.getAlias(i); + value = value + " "; + } + value += prop.getAlias(j-1); + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdo:aliasName"),value); + + } + + // End element + rc = xmlTextWriterEndElement(writer); + } + } + + + + // ----------------------------------------------------- + // End <sequence> / <choice> if necessary + // ----------------------------------------------------- + if (inSequence) + { + // End sequence + rc = xmlTextWriterEndElement(writer); + } + + // --------------------------------- + // Add ChangeSummary if there is one + // --------------------------------- + if (type.isChangeSummaryType()) + { + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("element"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + SDOXMLString("changeSummary")); + + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("type"), + SDOXMLString("sdo:ChangeSummaryType")); + + rc = xmlTextWriterEndElement(writer); + } + + // ------------------------------------------------------- + // Create <element> definitions + // ------------------------------------------------------- + for (j = 0; j < pl.size(); j++) + { + const Property& prop = pl[j]; + const Type& propType = prop.getType(); + + + SDOXMLString propTypeName = resolveName(propType.getURI(), + propType.getName(), targetNamespaceURI); + + bool isElement = false; + XSDPropertyInfo* pi = (XSDPropertyInfo*) + ((DASProperty*)&prop)->getDASValue("XMLDAS::PropertyInfo"); + if (pi) + { + if (pi->getPropertyDefinition().isElement) + isElement=true; + } + + if (!isElement + && !prop.isMany() + && !prop.isContainment()) + { + // ------------------------------- + // Write an <attribute> definition + // ------------------------------- + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("attribute"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("name"), + SDOXMLString(prop.getName())); + + if (!propType.isDataType()) + { + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("sdoxml:propertyType"), + propTypeName); + if (prop.isReference()) + { + propTypeName = "xsd:IDREF"; + } + else + { + propTypeName = "xsd:anyURI"; + } + } + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("type"), + propTypeName); + + // End attribute + rc = xmlTextWriterEndElement(writer); + + } + + } + + } + + // ----------------------------------------------------- + // Write open type information + // ----------------------------------------------------- + if (type.isOpenType()) + { + // <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("any"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("namespace"), + SDOXMLString("##other")); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("processContents"), + SDOXMLString("lax")); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("minOccurs"), + SDOXMLString("0")); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("maxOccurs"), + SDOXMLString("unbounded")); + + + // End element + rc = xmlTextWriterEndElement(writer); + + // ----------------------------------------------------- + // Write open type information 2 + // ----------------------------------------------------- + //<anyAttribute namespace="##any" processContents="lax"/> + + rc = xmlTextWriterStartElementNS(writer, xsd, SDOXMLString("anyAttribute"), NULL); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("namespace"), + SDOXMLString("##any")); + + rc = xmlTextWriterWriteAttribute(writer, + SDOXMLString("processContents"), + SDOXMLString("lax")); + + // End element + rc = xmlTextWriterEndElement(writer); + + } + + // ----------------------------------------------------- + // End <complexContent> if necessary + // ----------------------------------------------------- + if (baseType != 0) + { + rc = xmlTextWriterEndElement(writer); + } + + + rc = xmlTextWriterEndElement(writer); + } + } + + + // ----------------------------------------------- + // Write any open content from the factory + // ----------------------------------------------- + if (openprops.size() != 0) + { + writeProps(openprops, targetNamespaceURI, xsd); + } + // End the <schema> definition + rc = xmlTextWriterEndElement(writer); + return rc; + } + + + // ======================================================================================== + // resolveName - resolve a Type uri and name to xsd equivalent + // ======================================================================================== + SDOXMLString SDOXSDWriter::resolveName(const SDOXMLString& uri, const SDOXMLString& name, const SDOXMLString& targetNamespaceURI) + { + SDOXMLString resolvedName = name; + if (uri.equals(Type::SDOTypeNamespaceURI.c_str())) + { + resolvedName = "xsd:"; + if (name.equalsIgnoreCase("Boolean")) + { + resolvedName += "boolean"; + } + else if (name.equalsIgnoreCase("Byte")) + { + resolvedName += "byte"; + } + else if (name.equalsIgnoreCase("Bytes")) + { + resolvedName += "hexBinary"; + } + else if (name.equalsIgnoreCase("Character")) + { + resolvedName += "string"; + } + else if (name.equalsIgnoreCase("DataObject")) + { + resolvedName += "anyType"; + } + else if (name.equalsIgnoreCase("Date")) + { + resolvedName += "dateTime"; + } + else if (name.equalsIgnoreCase("DateTime")) + { + resolvedName += "dateTime"; + } + else if (name.equalsIgnoreCase("Day")) + { + resolvedName += "gDay"; + } + else if (name.equalsIgnoreCase("Decimal")) + { + resolvedName += "decimal"; + } + else if (name.equalsIgnoreCase("Double")) + { + resolvedName += "double"; + } + else if (name.equalsIgnoreCase("Duration")) + { + resolvedName += "duration"; + } + else if (name.equalsIgnoreCase("Float")) + { + resolvedName += "float"; + } + else if (name.equalsIgnoreCase("Int")) + { + resolvedName += "int"; + } + else if (name.equalsIgnoreCase("Integer")) + { + resolvedName += "integer"; + } + else if (name.equalsIgnoreCase("Long")) + { + resolvedName += "long"; + } + else if (name.equalsIgnoreCase("Month")) + { + resolvedName += "gMonth"; + } + else if (name.equalsIgnoreCase("MonthDay")) + { + resolvedName += "gMonthDay"; + } + else if (name.equalsIgnoreCase("Object")) + { + resolvedName += "anySimpleType"; + } + else if (name.equalsIgnoreCase("Short")) + { + resolvedName += "short"; + } + else if (name.equals("String")) + { + resolvedName += "String"; + } + else if (name.equalsIgnoreCase("Strings")) + { + resolvedName += "string"; + } + else if (name.equalsIgnoreCase("Time")) + { + resolvedName += "time"; + } + else if (name.equalsIgnoreCase("Year")) + { + resolvedName += "gYear"; + } + else if (name.equalsIgnoreCase("YearMonth")) + { + resolvedName += "gYearMonth"; + } + else if (name.equalsIgnoreCase("YearMonthDay")) + { + resolvedName += "date"; + } + else if (name.equalsIgnoreCase("URI")) + { + resolvedName += "anyURI"; + } + else + { + resolvedName += "String"; + } + } + else if (!targetNamespaceURI.isNull() && uri.equals(targetNamespaceURI)) + { + resolvedName = "tns:"; + resolvedName += name; + } + else + { + SDOXMLString propTypeName; + std::map<SDOXMLString,SDOXMLString>::iterator it; + it = namespaceMap.find(uri); + if (it != namespaceMap.end() && + !targetNamespaceURI.equals((*it).first)) + { + resolvedName = (*it).second + ":" + name; + } + } + + return resolvedName; + } + + + + } // End - namespace sdo +} // End - namespace commonj + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDWriter.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDWriter.h new file mode 100644 index 0000000000..88ab27fbe6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SDOXSDWriter.h @@ -0,0 +1,75 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 12:53:49 $ */ + +#ifndef _SDOXSDWRITER_H_ +#define _SDOXSDWRITER_H_ + +#include "commonj/sdo/disable_warn.h" + +#include <libxml/xmlwriter.h> +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/DataFactoryImpl.h" + + +namespace commonj +{ + namespace sdo + { + +/** + * SDOXSDWriter writes XSD from types and properties. + * The writer takes the contents of a data factory and writes an + * XSD which will be usable to serialize data from the graph. + */ + class SDOXSDWriter + { + + public: + + SDOXSDWriter(DataFactoryPtr dataFactory = NULL); + + virtual ~SDOXSDWriter(); + + int write(const TypeList& types, const SDOXMLString& targetNamespaceURI, + const propertyMap& openprops, int indent = -1); + + protected: + void setWriter(xmlTextWriterPtr textWriter); + void freeWriter(); + + private: + xmlTextWriterPtr writer; + + std::map<SDOXMLString,SDOXMLString> namespaceMap; + + void writeProps( const propertyMap& pl, const SDOXMLString& targetNamespaceURI, + SDOXMLString& xsd); + int writeDO(DataObjectPtr dataObject, const SDOXMLString& elementName); + + DataFactoryPtr dataFactory; + + SDOXMLString resolveName(const SDOXMLString& uri, const SDOXMLString& name, const SDOXMLString& targetNamespaceURI); + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SDOXSDWRITER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SchemaInfo.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SchemaInfo.cpp new file mode 100644 index 0000000000..024546876a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SchemaInfo.cpp @@ -0,0 +1,35 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SchemaInfo.h" +namespace commonj +{ + namespace sdo + { + + SchemaInfo::SchemaInfo() + { + } + + SchemaInfo::~SchemaInfo() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SchemaInfo.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SchemaInfo.h new file mode 100644 index 0000000000..0488df1893 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SchemaInfo.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _SCHEMAINFO_H_ +#define _SCHEMAINFO_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/DataObject.h" + +namespace commonj +{ + namespace sdo + { + +/** + * + * SchemaInfo holds information supplied by the parser on the schema + * held in an XSD + */ + class SchemaInfo + { + + public: + SDO_SPI SchemaInfo(); + SDO_SPI virtual ~SchemaInfo(); + + SDO_SPI SAX2Namespaces& getSchemaNamespaces() {return schemaNamespaces;} + + SDO_SPI const SDOXMLString& getTargetNamespaceURI() const {return targetNamespaceURI;} + SDO_SPI void setTargetNamespaceURI(const SDOXMLString& URI) {targetNamespaceURI = URI;} + + private: + SAX2Namespaces schemaNamespaces; + SDOXMLString targetNamespaceURI; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_SCHEMAINFO_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoCheck.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoCheck.cpp new file mode 100644 index 0000000000..d577d5bd12 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoCheck.cpp @@ -0,0 +1,27 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/SdoCheck.h" + +extern "C" { + SDO_API int SDOCheck(void) + { + return 0; + } +} diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoCheck.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoCheck.h new file mode 100644 index 0000000000..daf28c6d6f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoCheck.h @@ -0,0 +1,33 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/export.h" + + +/** + * SDOCheck is a simple C method which can be called to verify that + * this is an SDO library - this is used in building + */ + +extern "C" { + SDO_API int SDOCheck(void); +} + + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoRuntime.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoRuntime.cpp new file mode 100644 index 0000000000..175dc6dbd2 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoRuntime.cpp @@ -0,0 +1,64 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/01/23 16:39:24 $ */ + +#include "commonj/sdo/SdoRuntime.h" +#include <iostream> +#include <stdio.h> + +namespace commonj{ +namespace sdo{ + + +const unsigned int SdoRuntime::major = 0; +const unsigned int SdoRuntime::minor = 9; +const unsigned int SdoRuntime::fix =4; +char* SdoRuntime::version = 0; + + + +const char* SdoRuntime::getVersion() +{ + if (SdoRuntime::version == 0) + { + SdoRuntime::version = new char[11]; + sprintf(SdoRuntime::version,"%02d:%02d:%04d", + SdoRuntime::major, SdoRuntime::minor, SdoRuntime::fix); + } + return (const char *)SdoRuntime::version; + +} + +const unsigned int SdoRuntime::getMajor() +{ + return SdoRuntime::major; +} + +const unsigned int SdoRuntime::getMinor() +{ + return SdoRuntime::minor; +} + +const unsigned int SdoRuntime::getFix() +{ + return SdoRuntime::fix; +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoRuntime.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoRuntime.h new file mode 100644 index 0000000000..5720a34a0c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SdoRuntime.h @@ -0,0 +1,74 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef SDO_RUNTIME_H +#define SDO_RUNTIME_H +#include "commonj/sdo/export.h" + +namespace commonj{ +namespace sdo{ + +/** + * SDORuntime gives information about the version of the library. + */ + +class SdoRuntime +{ + public: + + virtual ~SdoRuntime(); + + /** + * The version as a string major:minor:fix + */ + + static SDO_API const char* getVersion(); + + /** + * The major version as an integer. + */ + + static SDO_API const unsigned int getMajor(); + + /** + * The minor version as an integer. + */ + + static SDO_API const unsigned int getMinor(); + + /** + * The fix level as an integer. + */ + + static SDO_API const unsigned int getFix(); + + + private: + static const unsigned int major; + static const unsigned int minor; + static const unsigned int fix; + static char* version; + +}; +}; +}; + + +#endif + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Sequence.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Sequence.cpp new file mode 100644 index 0000000000..3e830e9889 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Sequence.cpp @@ -0,0 +1,36 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" + +#include "commonj/sdo/Sequence.h" + +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SDORuntimeException.h" + + +namespace commonj{ +namespace sdo{ + +// all delegated to sequenceimpl +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Sequence.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Sequence.h new file mode 100644 index 0000000000..610848ce98 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Sequence.h @@ -0,0 +1,309 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/02 16:41:30 $ */ + +#ifndef _SEQUENCE_H_ +#define _SEQUENCE_H_ + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/RefCountingObject.h" +#include "commonj/sdo/RefCountingPointer.h" +#include "commonj/sdo/SDODate.h" +#include "commonj/sdo/Type.h" + + +namespace commonj{ +namespace sdo{ + +class Property; /* forward declaration */ +class DataObject; + +/** + * A sequence is a heterogeneous list of properties and corresponding values. + * It represents an ordered arbitrary mixture of data values from more + * than one property of a {@link DataObject data object}. + */ + +class Sequence : public RefCountingObject +{ + public: + /** size() returns the number of elements + * + * Returns the number of entries in the sequence. + */ + + SDO_API virtual unsigned int size() = 0; + + /** + * + * A Sequence element is either a free text item, or represents a property + * setting. If the element is a property setting, then the information + * held in the element consists of: + * -# The property which was set. + * -# The element of that property if it was many valued. + * -# The value which was set. + * + * If the sequence element is text, then there is no property, and only the + * methods for text retrieval will work. Use the isText() method to check + * before calling getProperty(). + */ + + SDO_API virtual const Property& getProperty(unsigned int index) = 0; + + /** + * Return the data object associated with this sequence + */ + + SDO_API virtual const DataObjectPtr getDataObject() = 0; + + /** + * + * The element of that property if it was many valued. Zero if the + * property was single valued. + */ + + SDO_API virtual unsigned int getListIndex(unsigned int index) = 0; + + /** + * + * The element contains the actual value set within the property. The + * method required to get that value will vary depending on the type + * of the property. This is shorthand for getProperty.getTypeEnum(). + */ + + SDO_API virtual Type::Types getTypeEnum(unsigned int index) = 0; + + /** + * + * This method searched the sequence for a setting which corresponds + * to the specified index of the specified property. Searches for single + * valued property settings may omit the pindex parameter. + */ + + + SDO_API virtual unsigned int getIndex(const Property& p, unsigned int pindex=0) = 0; + SDO_API virtual unsigned int getIndex(const char* propName, unsigned int pindex=0) = 0; + + /** + * + * These methods retrieve the setting according to the type of the + * property concerned. If a retrieval method is used which does not correspond to + * the correct type, a conversion will be performed, or an illegal conversion + * exception will be thrown. + */ + + SDO_API virtual const char* getCStringValue(unsigned int index) = 0; + SDO_API virtual bool getBooleanValue(unsigned int index) = 0; + SDO_API virtual char getByteValue(unsigned int index) = 0; + SDO_API virtual wchar_t getCharacterValue(unsigned int index) = 0; + SDO_API virtual unsigned int getStringValue(unsigned int index, wchar_t* val, unsigned int max) = 0; + SDO_API virtual unsigned int getBytesValue(unsigned int index, char* val, unsigned int max) = 0; + SDO_API virtual short getShortValue(unsigned int index) = 0; + SDO_API virtual long getIntegerValue(unsigned int index) = 0; + SDO_API virtual int64_t getLongValue(unsigned int index) = 0; + SDO_API virtual float getFloatValue(unsigned int index) = 0; + SDO_API virtual long double getDoubleValue(unsigned int index) = 0; + SDO_API virtual const SDODate getDateValue(unsigned int index) = 0; + SDO_API virtual DataObjectPtr getDataObjectValue(unsigned int index) = 0; + + /** + * + * getlength applies to string and byte buffer types, and allows the + * client to allocate the correct size of buffer before retrieving the + * value. + */ + + SDO_API virtual unsigned int getLength(unsigned int index) = 0; + + + /** + * + * The setter methods use an element of the sequence to perform a + * property setting. The value in the sequence is updated, and so is the + * rel value of the property in the data object. + */ + + SDO_API virtual void setCStringValue( unsigned int index, const char* s ) = 0; + SDO_API virtual void setBooleanValue( unsigned int index, bool b ) = 0; + SDO_API virtual void setByteValue( unsigned int index, char c ) = 0; + SDO_API virtual void setCharacterValue( unsigned int index, wchar_t c ) = 0; + SDO_API virtual void setStringValue( unsigned int index, const wchar_t* s , unsigned int len) = 0; + SDO_API virtual void setBytesValue( unsigned int index, const char* s , unsigned int len) = 0; + SDO_API virtual void setShortValue( unsigned int index, short s ) = 0; + SDO_API virtual void setIntegerValue( unsigned int index, long i ) = 0; + SDO_API virtual void setLongValue( unsigned int index, int64_t l ) = 0; + SDO_API virtual void setFloatValue( unsigned int index, float f ) = 0; + SDO_API virtual void setDoubleValue(unsigned int index, long double d ) = 0; + SDO_API virtual void setDateValue(unsigned int index, const SDODate t ) = 0; + SDO_API virtual void setDataObjectValue(unsigned int index, DataObjectPtr d ) = 0; + + + /** + * + * Sequences may be added to by usign the addXXX methods. These provoke + * a setting of the real value of the property concerned, and also append + * an element to the sequence to reflect that setting. + * Additions may be performed based on property name, property index or + * the Property itself. + */ + + SDO_API virtual bool addCString( const char* propertyName,const char* s ) = 0; + SDO_API virtual bool addBoolean( const char* propertyName,bool b ) = 0; + SDO_API virtual bool addByte( const char* propertyName,char c ) = 0; + SDO_API virtual bool addCharacter( const char* propertyName,wchar_t c ) = 0; + SDO_API virtual bool addString( const char* propertyName,const wchar_t* s , unsigned int len) = 0; + SDO_API virtual bool addBytes ( const char* propertyName,const char* s , unsigned int len) = 0; + SDO_API virtual bool addShort( const char* propertyName,short s ) = 0; + SDO_API virtual bool addInteger( const char* propertyName,long i ) = 0; + SDO_API virtual bool addLong( const char* propertyName,int64_t l ) = 0; + SDO_API virtual bool addFloat( const char* propertyName,float f ) = 0; + SDO_API virtual bool addDouble(const char* propertyName,long double d ) = 0; + SDO_API virtual bool addDate(const char* propertyName,const SDODate t ) = 0; + SDO_API virtual bool addDataObject(const char* propertyName,DataObjectPtr d ) = 0; + + + SDO_API virtual bool addCString( unsigned int propertyIndex,const char* s ) = 0; + SDO_API virtual bool addBoolean( unsigned int propertyIndex,bool b ) = 0; + SDO_API virtual bool addByte( unsigned int propertyIndex,char c ) = 0; + SDO_API virtual bool addCharacter( unsigned int propertyIndex,wchar_t c ) = 0; + SDO_API virtual bool addString( unsigned int propertyIndex,const wchar_t* s , unsigned int len) = 0; + SDO_API virtual bool addBytes( unsigned int propertyIndex,const char* s , unsigned int len) = 0; + SDO_API virtual bool addShort( unsigned int propertyIndex,short s ) = 0; + SDO_API virtual bool addInteger( unsigned int propertyIndex,long i ) = 0; + SDO_API virtual bool addLong( unsigned int propertyIndex,int64_t l ) = 0; + SDO_API virtual bool addFloat( unsigned int propertyIndex,float f ) = 0; + SDO_API virtual bool addDouble(unsigned int propertyIndex,long double d ) = 0; + SDO_API virtual bool addDate(unsigned int propertyIndex,const SDODate t ) = 0; + SDO_API virtual bool addDataObject(unsigned int propertyIndex,DataObjectPtr d ) = 0; + + + + SDO_API virtual bool addCString( const Property& property,const char* s ) = 0; + SDO_API virtual bool addBoolean( const Property& property,bool b ) = 0; + SDO_API virtual bool addByte( const Property& property,char c ) = 0; + SDO_API virtual bool addCharacter( const Property& property,wchar_t c ) = 0; + SDO_API virtual bool addString ( const Property& property,const wchar_t* s , unsigned int len) = 0; + SDO_API virtual bool addBytes( const Property& property,const char* s , unsigned int len) = 0; + SDO_API virtual bool addShort( const Property& property,short s ) = 0; + SDO_API virtual bool addInteger( const Property& property,long i ) = 0; + SDO_API virtual bool addLong( const Property& property,int64_t l ) = 0; + SDO_API virtual bool addFloat( const Property& property,float f ) = 0; + SDO_API virtual bool addDouble(const Property& property,long double d ) = 0; + SDO_API virtual bool addDate(const Property& property,const SDODate t ) = 0; + SDO_API virtual bool addDataObject(const Property& property,DataObjectPtr d ) = 0; + + + /** + * + * Sequences may be added to by usign the addXXX methods. These provoke + * a setting of the real value of the property concerned, and also append + * an element to the sequence to reflect that setting. + * Additions may be performed based on property name, property index or + * the Property itself. + * The add method also has an override to allow insertion of a sequence element + * before any index. + */ + + SDO_API virtual bool addCString( unsigned int index,const char* propertyName,const char* s ) = 0; + SDO_API virtual bool addBoolean( unsigned int index,const char* propertyName,bool b ) = 0; + SDO_API virtual bool addByte( unsigned int index,const char* propertyName,char c ) = 0; + SDO_API virtual bool addCharacter( unsigned int index,const char* propertyName,wchar_t c ) = 0; + SDO_API virtual bool addString( unsigned int index,const char* propertyName,const wchar_t* s, unsigned int len ) = 0; + SDO_API virtual bool addBytes( unsigned int index,const char* propertyName,const char* s , unsigned int len) = 0; + SDO_API virtual bool addShort( unsigned int index,const char* propertyName,short s ) = 0; + SDO_API virtual bool addInteger( unsigned int index,const char* propertyName,long i ) = 0; + SDO_API virtual bool addLong( unsigned int index,const char* propertyName,int64_t l ) = 0; + SDO_API virtual bool addFloat( unsigned int index,const char* propertyName,float f ) = 0; + SDO_API virtual bool addDouble(unsigned int index,const char* propertyName,long double d ) = 0; + SDO_API virtual bool addDate(unsigned int index,const char* propertyName,const SDODate t ) = 0; + SDO_API virtual bool addDataObject(unsigned int index,const char* propertyName,DataObjectPtr d ) = 0; + + + SDO_API virtual bool addCString( unsigned int index,unsigned int propertyIndex,const char* s ) = 0; + SDO_API virtual bool addBoolean( unsigned int index,unsigned int propertyIndex,bool b ) = 0; + SDO_API virtual bool addByte( unsigned int index,unsigned int propertyIndex,char c ) = 0; + SDO_API virtual bool addCharacter( unsigned int index,unsigned int propertyIndex,wchar_t c ) = 0; + SDO_API virtual bool addString( unsigned int index,unsigned int propertyIndex,const wchar_t* s , unsigned int len) = 0; + SDO_API virtual bool addBytes( unsigned int index,unsigned int propertyIndex,const char* s , unsigned int len) = 0; + SDO_API virtual bool addShort( unsigned int index,unsigned int propertyIndex,short s ) = 0; + SDO_API virtual bool addInteger( unsigned int index,unsigned int propertyIndex,long i ) = 0; + SDO_API virtual bool addLong( unsigned int index,unsigned int propertyIndex,int64_t l ) = 0; + SDO_API virtual bool addFloat( unsigned int index,unsigned int propertyIndex,float f ) = 0; + SDO_API virtual bool addDouble(unsigned int index,unsigned int propertyIndex,long double d ) = 0; + SDO_API virtual bool addDate(unsigned int index,unsigned int propertyIndex,const SDODate t ) = 0; + SDO_API virtual bool addDataObject(unsigned int index,unsigned int propertyIndex,DataObjectPtr d ) = 0; + + + SDO_API virtual bool addCString( unsigned int index,const Property& property,const char* s ) = 0; + SDO_API virtual bool addBoolean( unsigned int index,const Property& property,bool b ) = 0; + SDO_API virtual bool addByte( unsigned int index,const Property& property,char c ) = 0; + SDO_API virtual bool addCharacter( unsigned int index,const Property& property,wchar_t c ) = 0; + SDO_API virtual bool addString( unsigned int index,const Property& property,const wchar_t* s , unsigned int len) = 0; + SDO_API virtual bool addBytes( unsigned int index,const Property& property,const char* s , unsigned int len) = 0; + SDO_API virtual bool addShort( unsigned int index,const Property& property,short s ) = 0; + SDO_API virtual bool addInteger( unsigned int index,const Property& property,long i ) = 0; + SDO_API virtual bool addLong( unsigned int index,const Property& property,int64_t l ) = 0; + SDO_API virtual bool addFloat( unsigned int index,const Property& property,float f ) = 0; + SDO_API virtual bool addDouble(unsigned int index,const Property& property,long double d ) = 0; + SDO_API virtual bool addDate(unsigned int index,const Property& property,const SDODate t ) = 0; + SDO_API virtual bool addDataObject(unsigned int index,const Property& property,DataObjectPtr d ) = 0; + + + /** remove() removes an item. + * + * Remove the item at the specified index in the sequence. + * This has no effect on the value of the property in the data object, + * but the setting is no longer recorded. + */ + SDO_API virtual void remove(unsigned int index) = 0; + SDO_API virtual void removeAll(const Property& p) = 0; + + /** + * Moves an entry in the sequence from one index to another. This + * makes the entry appear to have been set at a different point in + * the sequence, but does not alter the actual value set. + */ + + SDO_API virtual void move(unsigned int toIndex, unsigned int fromIndex) = 0; + + /** + * The text setting APIs add an element to the sequence which + * is not a property setting. + * This is text which may be retieved in sequence with the settings. + */ + + SDO_API virtual bool addText(const char* text) = 0; + SDO_API virtual bool addText(unsigned int index, const char* text) = 0; + SDO_API virtual bool setText(unsigned int index, const char* text) = 0; + + /** + * isText returns true if the element is not a property setting. + * This method should be used before getting the Property, to avoid an + * exception + */ + + SDO_API virtual bool isText(unsigned int index) = 0; + +}; + + +}; +}; + +#endif //_SEQUENCE_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SequenceImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SequenceImpl.cpp new file mode 100644 index 0000000000..37be7881be --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SequenceImpl.cpp @@ -0,0 +1,977 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/07 08:25:11 $ */ + +#include "commonj/sdo/disable_warn.h" +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" + +#include "commonj/sdo/SequenceImpl.h" + +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/DataObjectImpl.h" +#include "commonj/sdo/SDORuntimeException.h" +using namespace std; + + +#define CHECK_RANGE\ + if (index >= the_list.size()){\ + std::string msg("Index out of range:");\ + msg += index;\ + SDO_THROW_EXCEPTION("Sequence API", SDOIndexOutOfRangeException,\ + msg.c_str());\ + }\ + unsigned int j = 0;\ + for (i = the_list.begin(); (j < index) && (i != the_list.end()); ++i)\ + {\ + j++;\ + } + + +namespace commonj{ +namespace sdo{ + + SequenceImpl::SequenceImpl() + { + SDO_THROW_EXCEPTION("Sequence constructor", SDORuntimeException,\ + "SequenceImpl::construction without a data object");\ + } + + SequenceImpl::SequenceImpl(DataObject* indo) + { + the_do = (DataObjectImpl*)indo; + } + + SequenceImpl::SequenceImpl(SequenceImpl* inseq) + { + // take a copy of the_list + the_list = inseq->the_list; + } + + unsigned int SequenceImpl::size() + { + return the_list.size(); + } + + + /** + * Return the data object associated with this sequence + */ + + const DataObjectPtr SequenceImpl::getDataObject() + { + return the_do; + } + + const Property& SequenceImpl::getProperty(unsigned int index) + { + SEQUENCE_ITEM_LIST::iterator i; + + if (isText(index)) + { + std::string msg("Cannot get property of a text item"); + msg += index; + SDO_THROW_EXCEPTION("getProperty", SDOUnsupportedOperationException, + msg.c_str()); + } + + unsigned int j = 0; + for (i = the_list.begin() ; (j < index) && (i != the_list.end()); ++i){j++;} + + if (i != the_list.end()) { + return *((*i).getProp()); + } + std::string msg("Index out of range:"); + msg += index; + SDO_THROW_EXCEPTION("getProperty", SDOIndexOutOfRangeException, + msg.c_str()); + } + + Type::Types SequenceImpl::getTypeEnum(unsigned int index) + { + SEQUENCE_ITEM_LIST::iterator i; + + unsigned int j = 0; + for (i = the_list.begin() ; (j < index) && (i != the_list.end()); ++i){j++;} + + if (i != the_list.end()) { + if ((*i).getProp() == 0) { + // text type + return Type::TextType; + } + return (*i).getProp()->getTypeEnum(); + } + std::string msg("Index out of range:"); + msg += index; + SDO_THROW_EXCEPTION("getTypeEnum", SDOIndexOutOfRangeException, + msg.c_str()); + } + + unsigned int SequenceImpl::getListIndex(unsigned int index) + { + SEQUENCE_ITEM_LIST::iterator i; + unsigned int j = 0; + for (i = the_list.begin() ; (j < index) && (i != the_list.end()); ++i){j++;} + + if (i != the_list.end()) { + if ((*i).getProp() == 0) + { + std::string msg("Get list index on text property"); + SDO_THROW_EXCEPTION("getListIndex", SDOUnsupportedOperationException, + msg.c_str()); + } + if ( (*i).getProp()->isMany()) + { + return (*i).getIndex(); + } + else + { + std::string msg("Get list index on text single valued property"); + SDO_THROW_EXCEPTION("getListIndex", SDOUnsupportedOperationException, + msg.c_str()); + } + } + std::string msg("Index out of range:"); + msg += index; + SDO_THROW_EXCEPTION("getListIndex", SDOIndexOutOfRangeException, + msg.c_str()); + } + + unsigned int SequenceImpl::getIndex(const char* propName, unsigned int pindex) + { + SEQUENCE_ITEM_LIST::iterator i; + unsigned int j = 0; + for (i=the_list.begin(), j=0;i != the_list.end();++i,++j) { + const Property* p = (*i).getProp(); + if (p == 0 ) continue; // avoid text + if (!strcmp(p->getName(), propName)) { + if (p->isMany()) + { + if( pindex == (*i).getIndex())return j; + } + else { + return j; + } + } + } + SDO_THROW_EXCEPTION("getIndex", SDOIndexOutOfRangeException, + "SequenceImpl::getIndex - property Setting not in sequence"); + } + + unsigned int SequenceImpl::getIndex(const Property& p, unsigned int pindex) + { + return getIndex(p.getName(), pindex); + } + + /////////////////////////////////////////////////////////////////////////// + // specific getters for prims and data objects + /////////////////////////////////////////////////////////////////////////// + + +#define StringGetter(returntype,primtype,defval)\ + returntype SequenceImpl::get##primtype##Value(unsigned int index)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + CHECK_RANGE;\ + const Property* p = (*i).getProp();\ + if (p == 0) {\ + return (*i).getText();\ + }\ + if (p->isMany())\ + {\ + DataObjectList& dol = the_do->getList(*p);\ + DataObject* list_do = dol[(*i).getIndex()];\ + if (list_do != 0)\ + {\ + return ((DataObjectImpl*)list_do)->get##primtype();\ + }\ + return defval;\ + }\ + return the_do->get##primtype(*((*i).getProp()));\ + } + +#define getter(returntype,primtype,defval)\ + returntype SequenceImpl::get##primtype##Value(unsigned int index)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + CHECK_RANGE;\ + const Property* p = (*i).getProp();\ + if (p == 0) {\ + return defval;\ + }\ + if (p->isMany())\ + {\ + DataObjectList& dol = the_do->getList(*p);\ + DataObject* list_do = dol[(*i).getIndex()];\ + if (list_do != 0)\ + {\ + return ((DataObjectImpl*)list_do)->get##primtype();\ + }\ + return defval;\ + }\ + return the_do->get##primtype(*((*i).getProp()));\ + } + +#define ObjectGetter(returntype,primtype,defval)\ + returntype SequenceImpl::get##primtype##Value(unsigned int index)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + CHECK_RANGE;\ + const Property* p = (*i).getProp();\ + if (p == 0) {\ + return defval;\ + }\ + if (p->isMany())\ + {\ + DataObjectList& dol = the_do->getList(*p);\ + DataObject* list_do = dol[(*i).getIndex()];\ + if (list_do != 0)\ + {\ + return list_do;\ + }\ + return defval;\ + }\ + return the_do->get##primtype(*((*i).getProp()));\ + } + +#define CharGetter(returntype,primtype,defval)\ + unsigned int SequenceImpl::get##primtype##Value(unsigned int index, returntype ptr, unsigned int max)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + CHECK_RANGE;\ + const Property* p = (*i).getProp();\ + if (p == 0) {\ + return defval;\ + }\ + if (p->isMany())\ + {\ + DataObjectList& dol = the_do->getList(*p);\ + DataObject* list_do = dol[(*i).getIndex()];\ + if (list_do != 0)\ + {\ + return ((DataObjectImpl*)list_do)->get##primtype(ptr, max);\ + }\ + return defval;\ + }\ + return the_do->get##primtype(*((*i).getProp()), ptr, max);\ + } + + +StringGetter(const char* , CString, 0); + +CharGetter( wchar_t* , String, 0); +CharGetter( char*, Bytes, 0); + +unsigned int SequenceImpl::getLength(unsigned int index) +{ + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + const Property* p = (*i).getProp(); + switch (p->getTypeEnum()) + { + case Type::StringType: + return getStringValue(index,0,0); + case Type::BytesType: + return getBytesValue(index,0,0); + default: + return 0; + } +} + +getter(bool, Boolean, false); +getter(char, Byte, (char)0); +getter(wchar_t, Character, 0); +getter(short, Short, 0); +getter(long, Integer, 0L); +getter(int64_t, Long, 0); +getter(float, Float, (float)0); +getter(long double, Double, 0); +getter(const SDODate, Date, 0); + +ObjectGetter(RefCountingPointer<DataObject> , DataObject, 0); + + + /////////////////////////////////////////////////////////////////////////// + // generic getter for those types which support it + /////////////////////////////////////////////////////////////////////////// + + void SequenceImpl::setCStringValue( unsigned int index, const char* s ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + (*i).setText(s); + return; + } + the_do->setCString(*((*i).getProp()),s); + + } + void SequenceImpl::setBooleanValue( unsigned int index, bool b ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setBoolean(*((*i).getProp()),b); + } + + void SequenceImpl::setByteValue( unsigned int index, char c ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setByte(*((*i).getProp()),c); + } + + void SequenceImpl::setCharacterValue( unsigned int index, wchar_t c ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setCharacter(*((*i).getProp()),c); + } + void SequenceImpl::setStringValue( unsigned int index, const wchar_t* s , unsigned int len) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setString(*((*i).getProp()),s, len); + } + void SequenceImpl::setBytesValue( unsigned int index, const char* s , unsigned int len) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setBytes(*((*i).getProp()),s, len); + } + void SequenceImpl::setShortValue( unsigned int index, short s ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setShort(*((*i).getProp()),s); + } + + void SequenceImpl::setIntegerValue( unsigned int index, long l) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setInteger(*((*i).getProp()),l); + } + + + void SequenceImpl::setLongValue( unsigned int index, int64_t l ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setLong(*((*i).getProp()),l); + } + + void SequenceImpl::setFloatValue( unsigned int index, float f ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setFloat(*((*i).getProp()),f); + } + + + void SequenceImpl::setDoubleValue(unsigned int index, long double d ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setDouble(*((*i).getProp()),d); + } + + void SequenceImpl::setDateValue(unsigned int index, const SDODate t ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setDate(*((*i).getProp()),t); + } + + void SequenceImpl::setDataObjectValue(unsigned int index, DataObjectPtr d ) + { + SEQUENCE_ITEM_LIST::iterator i; + CHECK_RANGE; + if ((*i).getProp() == 0) { + return; + } + the_do->setDataObject(*((*i).getProp()),d); + } + + +#define doadder(primtype,primval)\ + bool SequenceImpl::add##primtype(const char* propertyName, primval v)\ + {\ + const PropertyImpl* p = the_do->getPropertyImpl(propertyName);\ + if (p == 0)\ + {\ + if (the_do->getType().isOpenType())\ + {\ + p = the_do->define ##primtype (propertyName, v->getType());\ + }\ + if (p == 0)\ + {\ + std::string msg("Cannot find property:");\ + msg += propertyName;\ + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException,\ + msg.c_str());\ + }\ + }\ + return add##primtype((const Property&)*p,v);\ + }\ + bool SequenceImpl::add##primtype(unsigned int propertyIndex, primval v)\ + {\ + return add##primtype(the_do->getProperty(propertyIndex), v);\ + }\ + bool SequenceImpl::add##primtype(const Property& p, primval v)\ + {\ + if (p.isMany())\ + {\ + DataObjectList& dol = the_do->getList(p);\ + dol.append((primval)v);\ + /* the_list.push_back(seq_item(&p,dol.size()-1));*/\ + return true;\ + }\ + SEQUENCE_ITEM_LIST::iterator i;\ + for (i=the_list.begin();i != the_list.end();++i) {\ + const Property* pp = (*i).getProp();\ + if (pp == 0) continue;\ + if (!strcmp(pp->getName(),p.getName()))\ + {\ + SDO_THROW_EXCEPTION("add", SDOUnsupportedOperationException,\ + "Sequence::add of property which already exists in sequence");\ + }\ + }\ + the_do->set##primtype(p,v);\ + the_list.push_back(seq_item(&p,0));\ + return true;\ + } + + +#define adder(primtype,primval, platval)\ + bool SequenceImpl::add##primtype(const char* propertyName, primval v)\ + {\ + const PropertyImpl* p = the_do->getPropertyImpl(propertyName);\ + if (p == 0)\ + {\ + if (the_do->getType().isOpenType())\ + {\ + p = the_do->define ##primtype (propertyName);\ + }\ + if (p == 0)\ + {\ + std::string msg("Cannot find property:");\ + msg += propertyName;\ + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException,\ + msg.c_str());\ + }\ + }\ + return add##primtype((const Property&)*p,v);\ + }\ + bool SequenceImpl::add##primtype(unsigned int propertyIndex, primval v)\ + {\ + return add##primtype(the_do->getProperty(propertyIndex), v);\ + }\ + bool SequenceImpl::add##primtype(const Property& p, primval v)\ + {\ + if (p.isMany())\ + {\ + DataObjectList& dol = the_do->getList(p);\ + dol.append((platval)v);\ + /* the_list.push_back(seq_item(&p,dol.size()-1));*/\ + return true;\ + }\ + SEQUENCE_ITEM_LIST::iterator i;\ + for (i=the_list.begin();i != the_list.end();++i) {\ + const Property* pp = (*i).getProp();\ + if (pp == 0) continue;\ + if (!strcmp(pp->getName(),p.getName()))\ + {\ + SDO_THROW_EXCEPTION("add", SDOUnsupportedOperationException,\ + "Sequence::add of property which already exists in sequence");\ + }\ + }\ + the_do->set##primtype(p,v);\ + the_list.push_back(seq_item(&p,0));\ + return true;\ + } + +adder( CString , const char* , const char* ); +adder( Boolean, bool, bool); +adder( Byte, char , char ); +adder(Character, wchar_t, wchar_t); +adder(Short, short, short); +#if __WORDSIZE ==64 +adder(Integer, long, int64_t); +#else +adder(Integer, long, long); +#endif +adder(Long, int64_t, int64_t); +adder(Float, float, float); +adder(Double, long double, long double); +adder(Date, const SDODate, const SDODate); +doadder(DataObject, RefCountingPointer<DataObject> ); + + +#define charAdder(primtype,primval)\ + bool SequenceImpl::add##primtype(const char* propertyName, primval v, unsigned int len)\ + {\ + const PropertyImpl* p = the_do->getPropertyImpl(propertyName);\ + if (p == 0)\ + {\ + if (the_do->getType().isOpenType())\ + {\ + p = the_do->define ##primtype (propertyName);\ + }\ + if (p == 0)\ + {\ + std::string msg("Cannot find property:");\ + msg += propertyName;\ + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException,\ + msg.c_str());\ + }\ + }\ + return add##primtype((const Property&)*p,v, len);\ + }\ + bool SequenceImpl::add##primtype(unsigned int propertyIndex, primval v, unsigned int len)\ + {\ + return add##primtype(the_do->getProperty(propertyIndex), v, len);\ + }\ + bool SequenceImpl::add##primtype(const Property& p, primval v, unsigned int len)\ + {\ + if (p.isMany())\ + {\ + DataObjectList& dol = the_do->getList(p);\ + dol.append((primval)v, len);\ + /*the_list.push_back(seq_item(&p,dol.size()-1));*/\ + return true;\ + }\ + SEQUENCE_ITEM_LIST::iterator i;\ + for (i=the_list.begin();i != the_list.end();++i) {\ + const Property* pp = (*i).getProp();\ + if (pp == 0) continue;\ + if (!strcmp(pp->getName(),p.getName()))\ + {\ + SDO_THROW_EXCEPTION("add", SDOUnsupportedOperationException,\ + "Sequence::add of property which already exists in sequence");\ + }\ + }\ + the_do->set##primtype(p,v, len);\ + the_list.push_back(seq_item(&p,0));\ + return true;\ + } + + +charAdder ( String, const wchar_t* ); +charAdder ( Bytes , const char* ); + + +#define inserter(primtype,primval, platval)\ + bool SequenceImpl::add##primtype(unsigned int index, const char* propertyName, primval v)\ + {\ + const PropertyImpl* p = the_do->getPropertyImpl(propertyName);\ + if (p == 0)\ + {\ + if (the_do->getType().isOpenType())\ + {\ + p = the_do->define ##primtype (propertyName);\ + }\ + if (p == 0)\ + {\ + std::string msg("Cannot find property:");\ + msg += propertyName;\ + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException,\ + msg.c_str());\ + }\ + }\ + return add##primtype(index,(const Property&)*p,v);\ + }\ + bool SequenceImpl::add##primtype(unsigned int index, unsigned int propertyIndex, primval v)\ + {\ + return add##primtype(index,the_do->getProperty(propertyIndex), v);\ + }\ + bool SequenceImpl::add##primtype(unsigned int index, const Property& p, primval v)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + SEQUENCE_ITEM_LIST::iterator i2 = the_list.end();\ + int j;\ + if (index >= the_list.size()) {\ + return add##primtype(p,v);\ + }\ + if (p.isMany())\ + {\ + DataObjectList& dol = the_do->getList(p);\ + dol.append((platval)v);\ + j = 0;\ + for (i=the_list.begin();(j < index) && (i != the_list.end());++i) {\ + j++;\ + }\ + /*the_list.insert(i,seq_item(&p,dol.size()-1));*/\ + return true;\ + }\ + j = 0;\ + for (i=the_list.begin();i != the_list.end();++i) {\ + const Property* pp = (*i).getProp();\ + if (pp == 0) continue;\ + if (!strcmp(pp->getName(),p.getName()))\ + {\ + SDO_THROW_EXCEPTION("Insert", SDOUnsupportedOperationException,\ + "Sequence::insert of property which already exists in sequence");\ + }\ + if (j == index) {\ + i2 = i;\ + }\ + j++;\ + }\ + the_do->set##primtype(p,v);\ + the_list.insert(i2,seq_item(&p,0));\ + return true;\ + } + +#define doinserter(primtype,primval)\ + bool SequenceImpl::add##primtype(unsigned int index, const char* propertyName, primval v)\ + {\ + const PropertyImpl* p = the_do->getPropertyImpl(propertyName);\ + if (p == 0)\ + {\ + if (the_do->getType().isOpenType())\ + {\ + p = the_do->define ##primtype (propertyName, v->getType());\ + }\ + if (p == 0)\ + {\ + std::string msg("Cannot find property:");\ + msg += propertyName;\ + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException,\ + msg.c_str());\ + }\ + }\ + return add##primtype(index,(const Property&)*p,v);\ + }\ + bool SequenceImpl::add##primtype(unsigned int index, unsigned int propertyIndex, primval v)\ + {\ + return add##primtype(index,the_do->getProperty(propertyIndex), v);\ + }\ + bool SequenceImpl::add##primtype(unsigned int index, const Property& p, primval v)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + SEQUENCE_ITEM_LIST::iterator i2 = the_list.end();\ + int j;\ + if (index >= the_list.size()) {\ + return add##primtype(p,v);\ + }\ + if (p.isMany())\ + {\ + DataObjectList& dol = the_do->getList(p);\ + dol.append((primval)v);\ + j = 0;\ + for (i=the_list.begin();(j < index) && (i != the_list.end());++i) {\ + j++;\ + }\ + /*the_list.insert(i,seq_item(&p,dol.size()-1));*/\ + return true;\ + }\ + j = 0;\ + for (i=the_list.begin();i != the_list.end();++i) {\ + const Property* pp = (*i).getProp();\ + if (pp == 0) continue;\ + if (!strcmp(pp->getName(),p.getName()))\ + {\ + SDO_THROW_EXCEPTION("Insert", SDOUnsupportedOperationException,\ + "Sequence::insert of property which already exists in sequence");\ + }\ + if (j == index) {\ + i2 = i;\ + }\ + j++;\ + }\ + the_do->set##primtype(p,v);\ + the_list.insert(i2,seq_item(&p,0));\ + return true;\ + } + +inserter( CString , const char* , const char* ); +inserter( Boolean, bool, bool); +inserter( Byte, char , char ); +inserter(Character, wchar_t, wchar_t ); +inserter(Short, short, short ); +#if __WORDSIZE ==64 +inserter(Integer, long, int64_t ); +#else +inserter(Integer, long, long ); +#endif +inserter(Long, int64_t, int64_t); +inserter(Float, float, float ); +inserter(Double, long double, long double); +inserter(Date, const SDODate, const SDODate); +doinserter(DataObject, RefCountingPointer<DataObject>); + + + +#define charInserter(primtype,primval)\ + bool SequenceImpl::add##primtype(unsigned int index, const char* propertyName, primval v, unsigned int len)\ + {\ + const PropertyImpl* p = the_do->getPropertyImpl(propertyName);\ + if (p == 0)\ + {\ + if (the_do->getType().isOpenType())\ + {\ + p = the_do->define ##primtype (propertyName);\ + }\ + if (p == 0)\ + {\ + std::string msg("Cannot find property:");\ + msg += propertyName;\ + SDO_THROW_EXCEPTION("getProperty", SDOPropertyNotFoundException,\ + msg.c_str());\ + }\ + }\ + return add##primtype(index,(const Property&)*p,v, len);\ + }\ + bool SequenceImpl::add##primtype(unsigned int index, unsigned int propertyIndex, primval v, unsigned int len)\ + {\ + return add##primtype(index,the_do->getProperty(propertyIndex), v, len);\ + }\ + bool SequenceImpl::add##primtype(unsigned int index, const Property& p, primval v, unsigned int len)\ + {\ + SEQUENCE_ITEM_LIST::iterator i;\ + SEQUENCE_ITEM_LIST::iterator i2 = the_list.end();\ + unsigned int j;\ + if (index >= the_list.size()) {\ + return add##primtype(p,v, len);\ + }\ + if (p.isMany())\ + {\ + DataObjectList& dol = the_do->getList(p);\ + dol.append((primval)v, len);\ + j = 0;\ + for (i=the_list.begin();(j < index) && (i != the_list.end());++i) {\ + j++;\ + }\ + /*the_list.insert(i,seq_item(&p,dol.size()-1));*/\ + return true;\ + }\ + j = 0;\ + for (i=the_list.begin();i != the_list.end();++i) {\ + const Property* pp = (*i).getProp();\ + if (pp == 0) continue;\ + if (!strcmp(pp->getName(),p.getName()))\ + {\ + SDO_THROW_EXCEPTION("Insert", SDOUnsupportedOperationException,\ + "Sequence::insert of property which already exists in sequence");\ + }\ + if (j == index) {\ + i2 = i;\ + }\ + j++;\ + }\ + the_do->set##primtype(p,v, len);\ + the_list.insert(i2,seq_item(&p,0));\ + return true;\ + } + + +charInserter( String , const wchar_t* ); +charInserter (Bytes , const char* ); + + + + + + void SequenceImpl::push(const Property& p, unsigned int index) + { + the_list.push_back(seq_item(&p,index)); + } + + void SequenceImpl::remove(unsigned int index) + { + if (index >= the_list.size()) { + std::string msg("Index out of range:"); + msg += index; + SDO_THROW_EXCEPTION("Sequence remove", SDOIndexOutOfRangeException, + msg.c_str()); + } + SEQUENCE_ITEM_LIST::iterator i; + int j = 0; + for (i=the_list.begin();(j < index) && (i != the_list.end()) ; ++i) + { + j++; + } + the_list.erase(i); + return; + } + + void SequenceImpl::removeAll(const Property& p) + { + int j = 0; + const Property* prop; + SEQUENCE_ITEM_LIST::iterator i; + for (i=the_list.begin();i != the_list.end(); ++i) + { + prop = (*i).getProp(); + if (prop != 0) { + if (!strcmp(prop->getName(), + p.getName())) + { + // not sure this works - does i still equate + // to an iterator over the list after the remove? + i = the_list.erase(i); + } + } + } + + return; + } + + void SequenceImpl::move(unsigned int toIndex, unsigned int fromIndex) + { + if (fromIndex >= the_list.size()) { + std::string msg("Index out of range:"); + msg += fromIndex; + SDO_THROW_EXCEPTION("Sequence Move", SDOIndexOutOfRangeException, + msg.c_str()); + } + + if (toIndex == fromIndex) return; + + SEQUENCE_ITEM_LIST::iterator i1, + i2 = the_list.end(), + i3 = the_list.end(); + int j = 0; + for (i3 = the_list.begin(); + j < toIndex && j < fromIndex && + i3 != the_list.end() ; ++i3); + { + if (j == toIndex) i1 = i3; + if (j == fromIndex) i2 = i3; + j++; + } + + if (toIndex < fromIndex) + { + the_list.insert( i1, *i2); + the_list.erase(i2); + } + else + { + if (toIndex + 1 == the_list.size()) + { + the_list.push_back(*i2); + } + else + { + the_list.insert(++i1,*i2); + } + the_list.erase(i2); + } + return; + } + + bool SequenceImpl::addText(const char* text) + { + the_list.push_back(seq_item(text)); + return true; + } + + bool SequenceImpl::isText(unsigned int index) + { + if (index >= the_list.size()) { + return false; + } + SEQUENCE_ITEM_LIST::iterator i; + int j = 0; + for (i= the_list.begin(); (j < index) && (i != the_list.end()); ++i) + { + j++; + } + if ((*i).getProp() == 0) + { + return true; + } + + return false; + } + + bool SequenceImpl::addText(unsigned int index, const char* text) + { + if (index >= the_list.size()) { + return addText(text); + } + + SEQUENCE_ITEM_LIST::iterator i; + int j = 0; + for (i= the_list.begin(); (j < index) && (i != the_list.end()); ++i) + { + j++; + } + the_list.insert(i,seq_item(text)); + return true; + } + + bool SequenceImpl::setText(unsigned int index, const char* text) + { + if (index >= the_list.size()) { + return false; + } + + if (!isText(index)) + { + return false; + } + + SEQUENCE_ITEM_LIST::iterator i; + int j = 0; + for (i= the_list.begin(); (j < index) && (i != the_list.end()); ++i) + { + j++; + } + (*i).setText(text); + return true; + } + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SequenceImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SequenceImpl.h new file mode 100644 index 0000000000..620de1187d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SequenceImpl.h @@ -0,0 +1,375 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/17 16:01:05 $ */ + +#ifndef _SEQUENCEIMPL_H_ +#define _SEQUENCEIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + +#include <vector> + + +#include "commonj/sdo/Sequence.h" +#include "commonj/sdo/SDODate.h" + +#define SequenceImplPtr RefCountingPointer<SequenceImpl> + +namespace commonj{ +namespace sdo{ + +class Property; /* forward declaration */ +class DataObjectImpl; + +/** SequenceImpl implements the abstract class Sequence. + * + * A sequence is a heterogeneous list of properties and corresponding values. + * It represents an ordered arbitrary mixture of data values from more + * than one property of a {@link DataObject data object}. + */ + +class SequenceImpl : public Sequence +{ + public: + /////////////////////////////////////////////////////////////////////////// + // Returns the number of entries in the sequence. + // @return the number of entries. + /////////////////////////////////////////////////////////////////////////// + virtual unsigned int size(); + + /////////////////////////////////////////////////////////////////////////// + // Returns the property for the given entry index. + /////////////////////////////////////////////////////////////////////////// + virtual const Property& getProperty(unsigned int index); + + /** + * Return the data object associated with this sequence + */ + + SDO_API virtual const DataObjectPtr getDataObject(); + + /////////////////////////////////////////////////////////////////////////// + // Returns the property for the given entry index. + /////////////////////////////////////////////////////////////////////////// + virtual unsigned int getIndex(const Property& p, unsigned int pindex=0); + virtual unsigned int getIndex(const char* propName, unsigned int pindex=0); + + virtual unsigned int getListIndex(unsigned int index); + + Type::Types getTypeEnum(unsigned int index); + + + /////////////////////////////////////////////////////////////////////////// + // Returns the property value for the given entry index. + // @param index the index of the entry. + // @return the value for the given entry index.. + /////////////////////////////////////////////////////////////////////////// + virtual const char* getCStringValue(unsigned int index); + virtual bool getBooleanValue(unsigned int index); + virtual char getByteValue(unsigned int index); + virtual wchar_t getCharacterValue(unsigned int index); + virtual unsigned int getStringValue(unsigned int index, wchar_t* val, unsigned int max); + virtual unsigned int getBytesValue(unsigned int index, char* val, unsigned int max); + virtual short getShortValue(unsigned int index); + virtual long getIntegerValue(unsigned int index); + virtual int64_t getLongValue(unsigned int index); + virtual float getFloatValue(unsigned int index); + virtual long double getDoubleValue(unsigned int index); + virtual const SDODate getDateValue(unsigned int index); + virtual DataObjectPtr getDataObjectValue(unsigned int index); + + virtual unsigned int getLength(unsigned int index); + + /////////////////////////////////////////////////////////////////////////// + // sets the entry at a specified index to the new value. + // @param index the index of the entry. + // @param value the new value for the entry. + /////////////////////////////////////////////////////////////////////////// + + virtual void setCStringValue( unsigned int index, const char* s ); + virtual void setBooleanValue( unsigned int index, bool b ); + virtual void setByteValue( unsigned int index, char c ); + virtual void setCharacterValue( unsigned int index, wchar_t c ); + virtual void setBytesValue( unsigned int index, const char* s , unsigned int len); + virtual void setStringValue( unsigned int index, const wchar_t* s , unsigned int len); + virtual void setShortValue( unsigned int index, short s ); + virtual void setIntegerValue( unsigned int index, long i ); + virtual void setLongValue( unsigned int index, int64_t l ); + virtual void setFloatValue( unsigned int index, float f ); + virtual void setDoubleValue( unsigned int index, long double d ); + virtual void setDateValue( unsigned int index, const SDODate t ); + virtual void setDataObjectValue(unsigned int index, DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // adds a new entry with the specified property name and value + // to the end of the entries. + // @param propertyName the name of the entry's property. + // @param value the value for the entry. + /////////////////////////////////////////////////////////////////////////// + virtual bool addCString( const char* propertyName,const char* s ); + virtual bool addBoolean( const char* propertyName,bool b ); + virtual bool addByte( const char* propertyName,char c ); + virtual bool addCharacter( const char* propertyName,wchar_t c ); + virtual bool addString( const char* propertyName,const wchar_t* s , unsigned int len); + virtual bool addBytes( const char* propertyName,const char* s , unsigned int len); + virtual bool addShort( const char* propertyName,short s ); + virtual bool addInteger( const char* propertyName,long i ); + virtual bool addLong( const char* propertyName,int64_t l ); + virtual bool addFloat( const char* propertyName,float f ); + virtual bool addDouble( const char* propertyName,long double d ); + virtual bool addDate( const char* propertyName,const SDODate t ); + virtual bool addDataObject(const char* propertyName,DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // adds a new entry with the specified property index and value + // to the end of the entries. + // @param propertyIndex the index of the entry's property. + // @param value the value for the entry. + /////////////////////////////////////////////////////////////////////////// + virtual bool addCString( unsigned int propertyIndex,const char* s ); + virtual bool addBoolean( unsigned int propertyIndex,bool b ); + virtual bool addByte( unsigned int propertyIndex,char c ); + virtual bool addCharacter( unsigned int propertyIndex,wchar_t c ); + virtual bool addString( unsigned int propertyIndex,const wchar_t* s , unsigned int len); + virtual bool addBytes( unsigned int propertyIndex,const char* s , unsigned int len); + virtual bool addShort( unsigned int propertyIndex,short s ); + virtual bool addInteger( unsigned int propertyIndex,long i ); + virtual bool addLong( unsigned int propertyIndex,int64_t l ); + virtual bool addFloat( unsigned int propertyIndex,float f ); + virtual bool addDouble( unsigned int propertyIndex,long double d ); + virtual bool addDate( unsigned int propertyIndex,const SDODate t ); + virtual bool addDataObject(unsigned int propertyIndex,DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // adds a new entry with the specified property and value + // to the end of the entries. + // @param property the property of the entry. + // @param value the value for the entry. + /////////////////////////////////////////////////////////////////////////// + + virtual bool addCString( const Property& property,const char* s ); + virtual bool addBoolean( const Property& property,bool b ); + virtual bool addByte( const Property& property,char c ); + virtual bool addCharacter( const Property& property,wchar_t c ); + virtual bool addString( const Property& property,const wchar_t* s , unsigned int len); + virtual bool addBytes( const Property& property,const char* s , unsigned int len); + virtual bool addShort( const Property& property,short s ); + virtual bool addInteger( const Property& property,long i ); + virtual bool addLong( const Property& property,int64_t l ); + virtual bool addFloat( const Property& property,float f ); + virtual bool addDouble( const Property& property,long double d ); + virtual bool addDate( const Property& property,const SDODate t ); + virtual bool addDataObject(const Property& property,DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // adds a new entry with the specified property name and value + // at the specified entry index. + // @param index the index at which to add the entry. + // @param propertyName the name of the entry's property. + // @param value the value for the entry. + /////////////////////////////////////////////////////////////////////////// + virtual bool addCString( unsigned int index,const char* propertyName,const char* s ); + virtual bool addBoolean( unsigned int index,const char* propertyName,bool b ); + virtual bool addByte( unsigned int index,const char* propertyName,char c ); + virtual bool addCharacter( unsigned int index,const char* propertyName,wchar_t c ); + virtual bool addString( unsigned int index,const char* propertyName,const wchar_t* s , unsigned int len); + virtual bool addBytes( unsigned int index,const char* propertyName,const char* s , unsigned int len); + virtual bool addShort( unsigned int index,const char* propertyName,short s ); + virtual bool addInteger( unsigned int index,const char* propertyName,long i ); + virtual bool addLong( unsigned int index,const char* propertyName,int64_t l ); + virtual bool addFloat( unsigned int index,const char* propertyName,float f ); + virtual bool addDouble( unsigned int index,const char* propertyName,long double d ); + virtual bool addDate( unsigned int index,const char* propertyName,const SDODate t ); + virtual bool addDataObject(unsigned int index,const char* propertyName,DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // adds a new entry with the specified property index and value + // at the specified entry index. + // @param index the index at which to add the entry. + // @param propertyIndex the index of the entry's property. + // @param value the value for the entry. + /////////////////////////////////////////////////////////////////////////// + virtual bool addCString( unsigned int index,unsigned int propertyIndex,const char* s ); + virtual bool addBoolean( unsigned int index,unsigned int propertyIndex,bool b ); + virtual bool addByte( unsigned int index,unsigned int propertyIndex,char c ); + virtual bool addCharacter( unsigned int index,unsigned int propertyIndex,wchar_t c ); + virtual bool addString( unsigned int index,unsigned int propertyIndex,const wchar_t* s , unsigned int len); + virtual bool addBytes( unsigned int index,unsigned int propertyIndex,const char* s , unsigned int len); + virtual bool addShort( unsigned int index,unsigned int propertyIndex,short s ); + virtual bool addInteger( unsigned int index,unsigned int propertyIndex,long i ); + virtual bool addLong( unsigned int index,unsigned int propertyIndex,int64_t l ); + virtual bool addFloat( unsigned int index,unsigned int propertyIndex,float f ); + virtual bool addDouble( unsigned int index,unsigned int propertyIndex,long double d ); + virtual bool addDate( unsigned int index,unsigned int propertyIndex,const SDODate t ); + virtual bool addDataObject(unsigned int index,unsigned int propertyIndex,DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // adds a new entry with the specified property and value + // at the specified entry index. + // @param index the index at which to add the entry. + // @param property the property of the entry. + // @param value the value for the entry. + /////////////////////////////////////////////////////////////////////////// + virtual bool addCString( unsigned int index,const Property& property,const char* s ); + virtual bool addBoolean( unsigned int index,const Property& property,bool b ); + virtual bool addByte( unsigned int index,const Property& property,char c ); + virtual bool addCharacter( unsigned int index,const Property& property,wchar_t c ); + virtual bool addString( unsigned int index,const Property& property,const wchar_t* s , unsigned int len); + virtual bool addBytes( unsigned int index,const Property& property,const char* s , unsigned int len); + virtual bool addShort( unsigned int index,const Property& property,short s ); + virtual bool addInteger( unsigned int index,const Property& property,long i ); + virtual bool addLong( unsigned int index,const Property& property,int64_t l ); + virtual bool addFloat( unsigned int index,const Property& property,float f ); + virtual bool addDouble( unsigned int index,const Property& property,long double d ); + virtual bool addDate( unsigned int index,const Property& property,const SDODate t ); + virtual bool addDataObject(unsigned int index,const Property& property,DataObjectPtr d ); + + + /////////////////////////////////////////////////////////////////////////// + // removes the entry at the given entry index. + // @param index the index of the entry + /////////////////////////////////////////////////////////////////////////// + virtual void remove(unsigned int index); + virtual void removeAll(const Property& p); + + /////////////////////////////////////////////////////////////////////////// + // pushes a new entry without setting the property. + // @param index the index of the entry + /////////////////////////////////////////////////////////////////////////// + virtual void push(const Property& p, unsigned int index); + + /////////////////////////////////////////////////////////////////////////// + // Moves the entry at <code>fromIndex</code> to <code>toIndex</code>. + // @param toIndex the index of the entry destination. + // @param fromIndex the index of the entry to move. + /////////////////////////////////////////////////////////////////////////// + virtual void move(unsigned int toIndex, unsigned int fromIndex); + + /////////////////////////////////////////////////////////////////////////// + // adds a new Setting with the SDO text Property + // to the end of the Settings. + // @param text value of the Setting. + /////////////////////////////////////////////////////////////////////////// + virtual bool addText(const char* text); + + /////////////////////////////////////////////////////////////////////////// + // adds a new Setting with the SDO text Property + // to the Settings. + // @param index the index at which to add the entry. + // @param text value of the Setting. + /////////////////////////////////////////////////////////////////////////// + virtual bool addText(unsigned int index, const char* text); + + /////////////////////////////////////////////////////////////////////////// + // sets a text Property + // @param index the index at which to set the entry. + // @param text value of the Setting. + /////////////////////////////////////////////////////////////////////////// + bool setText(unsigned int index, const char* text); + + /////////////////////////////////////////////////////////////////////////// + // Checks if an entry is text or a setting. + /////////////////////////////////////////////////////////////////////////// + virtual bool isText(unsigned int index); + + SequenceImpl(DataObject* the_do); + SequenceImpl(SequenceImpl* s); + + private: + + SequenceImpl(); + + DataObjectImpl* the_do; + + class seq_item { + public: + seq_item(const Property* p, unsigned int i): + the_prop(p) + { + index = i; + text = 0; + } + seq_item(const char* t) + { + text = new char[strlen(t) + 1]; + strcpy(text,t); + the_prop = 0; + } + + ~seq_item() + { + if (text) { + delete text; + } + } + + seq_item(const seq_item& sin) + { + the_prop = sin.the_prop; + index = sin.index; + if (sin.text) { + text = new char[strlen(sin.text) +1]; + strcpy(text, sin.text); + } + else + { + text =0; + } + } + + const Property* getProp() {return the_prop;} + unsigned int getIndex() { return index;} + char* getText() { return text;} + void setProp(Property* p) { the_prop = p;} + void setText(const char* intext) + { + if (intext != 0) + { + if (text != 0) + { + delete text; + } + text = new char[strlen(intext) +1]; + strcpy(text,intext); + } + } + void setIndex(unsigned int i) + { + index = i; + } + private: + const Property* the_prop; + unsigned int index; + char* text; + }; + + typedef std::list<seq_item> SEQUENCE_ITEM_LIST; + + SEQUENCE_ITEM_LIST the_list; + +}; +}; +}; + +#endif //_SEQUENCE_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Setting.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Setting.cpp new file mode 100644 index 0000000000..6aa8dab8b6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Setting.cpp @@ -0,0 +1,303 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/Setting.h" +#include "commonj/sdo/TypeImpl.h" + +namespace commonj{ +namespace sdo { + + Setting::Setting(bool set, bool nul, void* invalue, unsigned int len, const Property& p, unsigned int inindex) + : bisSet(set), bisNull(nul) , value(invalue),theProp(&p) + { + index = inindex; + length = len; + strbuf = 0; + } + + void Setting::copy(const Setting& s) + { + bisSet = s.isSet(); + bisNull = s.isNull(); + index = s.getIndex(); + length = s.getLength(); + theProp = &(s.getProperty()); + strbuf = 0; + switch (theProp->getTypeEnum()) + { + case Type::BooleanType: + value = new long; + *(long*)value = (long)s.getBooleanValue(); + break; + case Type::ByteType: + value = new long; + *(long*)value = (long)s.getByteValue(); + break; + case Type::CharacterType: + value = new long; + *(long*)value = (long)s.getCharacterValue(); + break; + case Type::IntegerType: + value = new long; + *(long*)value = (long)s.getIntegerValue(); + break; + case Type::ShortType: + value = new long; + *(long*)value = (long)s.getShortValue(); + break; + case Type::DoubleType: + value = new long double; + *(long double*)value = s.getDoubleValue(); + break; + case Type::FloatType: + value = new float; + *(float*)value = s.getFloatValue(); + break; + case Type::LongType: + value = new int64_t; + *(int64_t*)value = s.getLongValue(); + break; + case Type::DateType: + value = new long; + *(long*)value = long(s.getDateValue().getTime()); + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + value = new wchar_t[length]; + s.getStringValue((wchar_t*)value,length); + break; + case Type::BytesType: + value = new char[length]; + s.getBytesValue((char*)value,length); + break; + case Type::OtherTypes: + case Type::DataObjectType: + case Type::ChangeSummaryType: + value = s.getDataObjectValue(); + default: + break; + } + } + + Setting& Setting::operator=(const Setting& s) + { + if (this == &s) return *this; + copy(s); + return *this; + } + + Setting::Setting(const Setting& s) + { + copy(s); + } + + Setting::~Setting() + { + // The value has been allocated for everything except data objects + + switch (theProp->getTypeEnum()) + { + case Type::BooleanType: + case Type::ByteType: + case Type::CharacterType: + case Type::IntegerType: + case Type::ShortType: + delete (long*)value; + break; + case Type::DoubleType: + delete (long double*)value; + break; + case Type::FloatType: + delete (float*)value; + break; + case Type::LongType: + delete (int64_t*)value; + break; + case Type::DateType: + delete (long*)value; + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + delete (wchar_t*)value; + break; + case Type::BytesType: + delete (char*)value; + break; + case Type::OtherTypes: + case Type::DataObjectType: + case Type::ChangeSummaryType: + default: + break; + } + if (strbuf != 0) delete strbuf; + } + + const Property& Setting::getProperty() const + { + return *theProp; + } + + const Type& Setting::getType() const + { + return theProp->getType(); + } + + bool Setting::getBooleanValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToBoolean(value, length); + //if (value == 0) return false; + //if (*(long*)value != 0) { + // return true; + //} + //return false; + } + + char Setting::getByteValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToByte(value, length); + //if (value == 0) return 0; + //return (char)*(long*)value; + } + + wchar_t Setting::getCharacterValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToCharacter(value, length); + //if (value == 0) return 0; + //return (wchar_t)*(long*)value; + } + + unsigned int Setting::getBytesValue(char* buffer, unsigned int max) const + { + if (buffer == 0 && max == 0) return length; + + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToBytes(value, buffer,length, max); + //int i; + //char* c = (char*)value; + //for (i=0;i < max && i < length;i++) + //{ + // buffer[i] = (char)*c; + // c++; + //} + //return i; + } + + unsigned int Setting::getStringValue(wchar_t* buffer, unsigned int max) const + { + if (buffer == 0 && max == 0) return length; + + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToString(value, buffer,length, max); + //int i; + //wchar_t* c = (wchar_t*)value; + //for (i=0;i < max && i < length;i++) + //{ + // buffer[i] = (wchar_t)*c; + // c++; + //} + //return i; + } + + short Setting::getShortValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToShort(value,length); + //return (short)*(long*)value; + } + + long Setting::getIntegerValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToInteger(value, length); + //return *(long*)value; + } + + + int64_t Setting::getLongValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToLong(value, length); + //return (int64_t)*(int64_t*)value; + } + + float Setting::getFloatValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToFloat(value, length); + //return (float)*(float*)value; + } + + const SDODate Setting::getDateValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToDate(value, length); + } + + + long double Setting::getDoubleValue() const + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToDouble(value, length); + //return (long double)*(long double*)value; + } + + const char* Setting::getCStringValue() + { + TypeImpl* t = (TypeImpl*)&(getType()); + return t->convertToCString(value, &strbuf, length); + //return (const char*)value; + } + + RefCountingPointer<DataObject> Setting::getDataObjectValue() const + { + DataObject *dob = (DataObject*)value; + return RefCountingPointer<DataObject>(dob); + } + + + unsigned int Setting::getLength() const + { + return length; + } + + unsigned int Setting::getIndex() const + { + return index; + } + + bool Setting::isSet() const + { + return bisSet; + } + + bool Setting::isNull() const + { + return bisNull; + } + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Setting.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Setting.h new file mode 100644 index 0000000000..37de243716 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Setting.h @@ -0,0 +1,149 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef SETTING_H +#define SETTING_H + +#include "commonj/sdo/export.h" + +#include "commonj/sdo/Type.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SDODate.h" + +namespace commonj{ +namespace sdo { + + class Property; + + /** + * A Setting encapsulates a property and a corresponding single value of + * the property's type. + */ + + class Setting + { + public: + + Setting(bool set, bool nul, void* invalue, unsigned int len, const Property& p, + unsigned int inindex); + + Setting(const Setting& s); + + void copy(const Setting& s); + + Setting& operator=(const Setting& s); + + + virtual ~Setting(); + + + /** getProperty returns the property set. + * + * Returns the property of the Setting. + * @return the Setting property. + */ + + SDO_API const Property& getProperty() const; + + /** getType returns the type of the property + * + * Returns the type of this property. This is the same as + * getProperty().getType() + */ + + SDO_API const Type& getType() const; + + /** getTypeEnum returns the type enumerator + * + * Returns the enum for the type of this property + */ + + SDO_API Type::Types getTypeEnum() const; + + + /** get methods get the right type of value from the setting + * + * + * Returns the value of the Setting. This must be of the right type for + * Setting value. + */ + + SDO_API bool getBooleanValue() const; + SDO_API char getByteValue() const; + SDO_API wchar_t getCharacterValue() const; + SDO_API unsigned int getBytesValue(char* buffer, unsigned int max) const; + SDO_API unsigned int getStringValue(wchar_t* buffer, unsigned int max) const; + SDO_API short getShortValue() const; + SDO_API long getIntegerValue() const; + SDO_API int64_t getLongValue() const; + SDO_API float getFloatValue() const; + SDO_API long double getDoubleValue() const; + SDO_API const SDODate getDateValue() const; + SDO_API const char* getCStringValue() ; + SDO_API DataObjectPtr getDataObjectValue() const; + + + + /** getIndex returns the index in a many-valued property + * + * Returns the index of the Setting, if this is many valued + */ + + SDO_API unsigned int getIndex() const; + + + /** getLength gives the length of a string or bytes + * + * Returns the length of the setting, if this is a String or + * Bytes type + */ + + SDO_API unsigned int getLength() const ; + + /** isSet returns whether the property WAS set. + * + * Returns whether or not the property is set. This value comes from the + * setting, and tells us whether the property was set before the change + * occurred. + */ + + SDO_API bool isSet() const; + + /** isNull is true if the property value WAS null + * + * Returns whether or not the property was null beforfe the setting + * happened. + */ + + SDO_API bool isNull() const; + + private: + + bool bisSet; + bool bisNull; + void* value; + const Property* theProp; + unsigned int length; + unsigned int index; + char* strbuf; + }; +}; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SettingList.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SettingList.cpp new file mode 100644 index 0000000000..2617f49289 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SettingList.cpp @@ -0,0 +1,113 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/17 16:01:05 $ */ + +#include "commonj/sdo/SDORuntimeException.h" + +#include "commonj/sdo/SettingList.h" +#include "commonj/sdo/Logger.h" +#include "commonj/sdo/Setting.h" + +namespace commonj{ +namespace sdo { + + +//SettingList::SettingList(SETTING_VECTOR p) : slist (p) +//{ +//} + +/*SettingList::SettingList(const SettingList &pin) +{ + Logger::log("SettingList copy constructor\n"); + slist = std::vector<Setting>(pin.getVec()); +} +*/ + +SettingList::SettingList() +{ +} + +SettingList::~SettingList() +{ + while (slist.size() > 0) + { + Setting* s = slist[0]; + slist.erase(slist.begin()); + delete s; + } + +} + + +Setting& SettingList::operator[] (int pos) const +{ + validateIndex(pos); + return (*slist[pos]); +} + +Setting* SettingList::get(int pos) +{ + validateIndex(pos); + return (slist[pos]); +} + +int SettingList::size () const +{ + return slist.size(); +} + +//SETTING_VECTOR SettingList::getVec() const +//{ +// return slist; +//} + +void SettingList::insert (unsigned int index, Setting* d) +{ + slist.insert(slist.begin()+index, d); +} + +void SettingList::append ( Setting* d) +{ + slist.insert(slist.end(),d); +} + +void SettingList::remove(unsigned int index) +{ + validateIndex(index); + const Setting* s = slist[index]; + slist.erase(slist.begin()+index); + delete s; + return; +} + +void SettingList::validateIndex(int index) const +{ + if ((index < 0) || (index > size())) + { + std::string msg("Index out of range:"); + msg += index; + SDO_THROW_EXCEPTION("ValidateIndex", SDOIndexOutOfRangeException, + msg.c_str()); + + } + +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SettingList.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SettingList.h new file mode 100644 index 0000000000..63089a1b70 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/SettingList.h @@ -0,0 +1,75 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/17 16:01:05 $ */ + +#ifndef SETTINGLIST_H +#define SETTINGLIST_H + + + +#include <vector> +#include "commonj/sdo/Setting.h" + +namespace commonj{ +namespace sdo{ + +typedef std::vector< Setting*> SETTING_VECTOR; + +/** SettingList is a list of settings returned by a change summary + */ + +class SettingList +{ + +public: + //SettingList(SETTING_VECTOR sl); + SettingList(); + + virtual ~SettingList(); + + /** [] is the index operator + * + * This gives access to elements of the list + */ + + SDO_API virtual Setting& operator[] (int pos) const; + + /** size() returns the number of settings + * + * This method returns the size of the list os settings found. + * These may be creations, deletions or changes. + */ + + SDO_API virtual int size () const; + + virtual void insert (unsigned int index, Setting* d); + virtual void append ( Setting* d); + virtual void remove (unsigned int index); + virtual Setting* get (int pos); + + +private: + SETTING_VECTOR slist; + + void validateIndex(int index) const; +}; + +}; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Type.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Type.cpp new file mode 100644 index 0000000000..3f381ed1cf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Type.cpp @@ -0,0 +1,36 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/Type.h" + +namespace commonj{ +namespace sdo{ + + + Type::~Type() + { + } + + const SDOString Type::SDOTypeNamespaceURI = "commonj.sdo"; + +}; +}; +// end - namespace sdo + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Type.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Type.h new file mode 100644 index 0000000000..7b7b939d6e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/Type.h @@ -0,0 +1,230 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/02 16:41:30 $ */ + +#ifndef _SDO_TYPE_H_ +#define _SDO_TYPE_H_ + + +#include "commonj/sdo/export.h" + +#include "commonj/sdo/PropertyList.h" +#include "commonj/sdo/SDOString.h" + + +namespace commonj{ +namespace sdo{ + + + + +class Property; + + /** + * + * Type is a representation of the type of a property of a data object. + */ + +class Type +{ + +public: + + +/** \enum Types + * + * This is the enumerator for all DataType types. All DataObjectType types + * appear as a Type::Types of DataObjectType. + * otherTypes, ChangeSumamryType and TextType are not used by client code. + */ + + + SDO_API enum Types + { + // Zero is a value for 'unknown type; - all data objects' + OtherTypes = 0, + BigDecimalType, + BigIntegerType, + BooleanType, + ByteType, + BytesType, + CharacterType, + DateType, + DoubleType, + FloatType, + IntegerType, + LongType, + ShortType, + StringType, + UriType, + DataObjectType, + ChangeSummaryType, + TextType, + OpenDataObjectType, + num_types + }; + + virtual SDO_API ~Type(); + + /** getName returns the name of the type + * + * This method returns a const char* name of the type. + */ + + virtual SDO_API const char* getName() const = 0; + + /** getAlias returns the n'th alias + * + * This method returns a const char* corresponding to the + * alias at index n of the list of aliases. Use getAliasCount to + * discover the size of the list. + */ + + virtual SDO_API const char* getAlias(unsigned int index = 0) const = 0; + + /** getAliasCount returns the number of aliases + * + * This method returns the number of aliases for this type + */ + + virtual SDO_API unsigned int getAliasCount() const = 0; + + /** getBaseType returns the base if there is one + * + * This method returns a const Type* corresponding to the + * base Type for this type. The base type is the one which + * this type inherits from. + */ + + virtual SDO_API const Type* getBaseType() const = 0; + + /** getURI returns the URI for this type + * + * This method returns the URI for this type. The URI may be + * null. + */ + + virtual SDO_API const char* getURI() const = 0; + + + + /** getProperties returns a list of properties for this type + * + * This method returns the list of properties for this type. + * Instances of open types may have more properties than appear + * in this list. + * See the propertylist API. + */ + + virtual SDO_API PropertyList getProperties() const = 0; + + + /** getProperty returns a property for this type + * + * This method returns a property, by index or by name + */ + + virtual SDO_API const Property& getProperty(const char* propertyName) const = 0; + virtual SDO_API const Property& getProperty(const SDOString& propertyName) const = 0; + virtual SDO_API const Property& getProperty(unsigned int index) const = 0; + + /** getPropertyIndex returns an index + * + * This method returns a property index for a named property + */ + + virtual SDO_API unsigned int getPropertyIndex(const char* propertyName) const = 0; + virtual SDO_API unsigned int getPropertyIndex(const SDOString& propertyName) const = 0; + + /** isDataObjectType true if not a DataType + * + * This method returns true if the type is not a DataType, and is therefore + * a DataObjectType with properties. + */ + + virtual SDO_API bool isDataObjectType() const = 0; + + + /** isSequencedType true if the type is sequenced + * + * This method returns true if the type is sequenced, and is therefore + * objects of this type can be manipulate via their sequence interface. + */ + + virtual SDO_API bool isSequencedType() const = 0; + + + /** isOpenType true if the type is open + * + * Normal types have a predefined list of properties. Trying to set + * properties which do not exist will cause an exception to be thrown. + * Open types, on the other hand, may have properties added to their + * instances runtime. These properties get added silently when setting a + * property value for a property which does not exist. + * Different instances of these objects may have different lists of + * open properties. + */ + + virtual SDO_API bool isOpenType() const = 0; + + /** isAbstractType true if the type is not instantiable. + * + * An abstract type may not be instantiated. It is useful only as + * a base type to some other non-abstract type. + */ + + virtual SDO_API bool isAbstractType() const = 0; + + /** isDataType true if the type is not an object. + * + * A DataType is anything which is not a DataObjectType. This method + * is the opposite of isDataObjectType(). + */ + + virtual SDO_API bool isDataType() const = 0; + + + /** isChangeSummaryType true if the type is a change summary. + * + * There is only one type called ChangeSummary. This method serves + * no purpose in the C++ implementation. + */ + + virtual SDO_API bool isChangeSummaryType() const = 0; + + /** getTypeEnum gets the enum for this type. + * + * Each DataType has a defined value in the list of Types. + */ + + virtual SDO_API Type::Types getTypeEnum() const = 0; + + /** equals compares uri and name. + * + * The types are equal if the URI and Name are equal. + */ + + virtual SDO_API bool equals(const Type& tother) const = 0; + + static SDO_API const SDOString SDOTypeNamespaceURI; +}; + +}; +}; +#endif //_SDO_TYPE_H_ + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinition.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinition.cpp new file mode 100644 index 0000000000..f96d3ae138 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinition.cpp @@ -0,0 +1,225 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + + +#include "commonj/sdo/TypeDefinition.h" +#include "commonj/sdo/TypeDefinitionImpl.h" + +namespace commonj +{ + namespace sdo + { + TypeDefinition::TypeDefinition() + { + typedefinition = new TypeDefinitionImpl(); + } + + TypeDefinition::~TypeDefinition() + { + if (typedefinition != 0) delete typedefinition; + } + + void TypeDefinition::copy (const TypeDefinition& td) + { + if (typedefinition != 0) delete typedefinition; + typedefinition = new TypeDefinitionImpl(*(td.typedefinition)); + } + + TypeDefinition::TypeDefinition(const TypeDefinition& td) + { + copy(td); + } + + TypeDefinition& TypeDefinition::operator=(const TypeDefinition& td) + { + if (this != &td) + { + copy(td); + } + return *this; + } + + TypeDefinitionImpl* TypeDefinition::getTypeDefinition() + { + return typedefinition; + } + + void TypeDefinition::setUri(const char * inuri) + { + typedefinition->uri = inuri; + } + + const char * TypeDefinition::getUri() const + { + return (const char *)typedefinition->uri; + } + + + void TypeDefinition::setName(const char * inname) + { + typedefinition->name = inname; + } + + const char * TypeDefinition::getName() const + { + return (const char *)typedefinition->name; + } + + + void TypeDefinition::setLocalName(const char * inname) + { + typedefinition->localname = inname; + } + + const char * TypeDefinition::getLocalName() const + { + return (const char *)typedefinition->localname; + } + + + void TypeDefinition::setAliases(const char * inaliases) + { + typedefinition->aliases = inaliases; + } + + const char * TypeDefinition::getAliases() const + { + return (const char*)typedefinition->aliases; + } + + void TypeDefinition::setParentType(const char* uri, const char* name, + bool isrestriction) + { + typedefinition->parentTypeUri = uri; + typedefinition->parentTypeName = name; + typedefinition->isRestriction = isrestriction; + } + + const char * TypeDefinition::getParentTypeUri() const + { + return (const char *)typedefinition->parentTypeUri; + } + + const char * TypeDefinition::getParentTypeName() const + { + return (const char *)typedefinition->parentTypeName; + } + + void TypeDefinition::setIDPropertyName(const char * idpropname) + { + typedefinition->IDPropertyName = idpropname; + } + + const char * TypeDefinition::getIDPropertyName() const + { + return (const char *)typedefinition->IDPropertyName; + } + + void TypeDefinition::addPropertyDefinition(PropertyDefinition& p) + { + typedefinition->properties.push_back((PropertyDefinitionImpl&)(*(p.getPropertyDefinition()))); + } + + bool TypeDefinition::getIsDataType() const + { + return typedefinition->dataType; + } + + bool TypeDefinition::getIsOpen() const + { + return typedefinition->isOpen; + } + + bool TypeDefinition::getIsSequenced() const + { + return typedefinition->isSequenced; + } + + bool TypeDefinition::getIsAbstract() const + { + return typedefinition->isAbstract; + } + + bool TypeDefinition::getIsExtendedPrimitive() const + { + return typedefinition->isExtendedPrimitive; + } + + bool TypeDefinition::getIsFromList() const + { + return typedefinition->isFromList; + } + + bool TypeDefinition::getIsQName() const + { + return typedefinition->isQName; + } + + bool TypeDefinition::getIsMany() const + { + return typedefinition->isMany; + } + + void TypeDefinition::setIsDataType(bool value) + { + typedefinition->dataType = value; + } + + void TypeDefinition::setIsOpen(bool value) + { + typedefinition->isOpen = value; + } + + void TypeDefinition::setIsSequenced(bool value) + { + typedefinition->isSequenced = value; + } + + void TypeDefinition::setIsAbstract(bool value) + { + typedefinition->isAbstract = value; + } + + void TypeDefinition::setIsExtendedPrimitive(bool value) + { + typedefinition->isExtendedPrimitive = value; + } + + void TypeDefinition::setIsFromList(bool value) + { + typedefinition->isFromList = value; + } + + void TypeDefinition::setIsQName(bool value) + { + typedefinition->isQName = value; + } + + void TypeDefinition::setIsMany(bool value) + { + typedefinition->isMany = value; + } + + + int TypeDefinition::getGroupElementCount() const + { + return typedefinition->groupElementCount; + } + + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinition.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinition.h new file mode 100644 index 0000000000..4b4d9a1f86 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinition.h @@ -0,0 +1,109 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/13 08:35:04 $ */ + +#ifndef _TYPEDefinition_H_ +#define _TYPEDefinition_H_ + +#include "export.h" + + +#include "commonj/sdo/PropertyDefinition.h" +#include "list" + + +namespace commonj +{ + namespace sdo + { + + class TypeDefinitionImpl; + + +/** + * TypeDefinitionImpl holds information gathered from parsing the + * XSD and used for creating Types + */ + class SDO_API TypeDefinition + { + + public: + + + /*SDO_API*/ TypeDefinition(); + TypeDefinition(const TypeDefinition& td); + TypeDefinition& operator=(const TypeDefinition& td); + + /*SDO_API*/ virtual ~TypeDefinition(); + + + TypeDefinitionImpl* getTypeDefinition(); + + /*SDO_API*/ void setUri(const char * inuri) ; + /*SDO_API*/ const char * getUri() const; + + /*SDO_API*/ void setName(const char * inname) ; + /*SDO_API*/ const char * getName() const; + + /*SDO_API*/ void setLocalName(const char * inname) ; + /*SDO_API*/ const char * getLocalName() const; + + /*SDO_API*/ void setAliases(const char * inaliases) ; + /*SDO_API*/ const char * getAliases() const; + + + /*SDO_API*/ void setParentType(const char* uri, const char* name, + bool isrestriction); + /*SDO_API*/ const char * getParentTypeUri() const; + /*SDO_API*/ const char * getParentTypeName() const; + + /*SDO_API*/ void setIDPropertyName(const char * idpropname) ; + /*SDO_API*/ const char * getIDPropertyName() const; + + + /*SDO_API*/ void addPropertyDefinition(PropertyDefinition& p); + + /*SDO_API*/ bool getIsDataType() const; + /*SDO_API*/ bool getIsOpen() const; + /*SDO_API*/ bool getIsSequenced() const; + /*SDO_API*/ bool getIsAbstract() const; + /*SDO_API*/ bool getIsExtendedPrimitive() const; + /*SDO_API*/ bool getIsFromList() const; + /*SDO_API*/ bool getIsQName() const; + /*SDO_API*/ bool getIsMany() const; + + /*SDO_API*/ void setIsDataType(bool value); + /*SDO_API*/ void setIsOpen(bool value); + /*SDO_API*/ void setIsSequenced(bool value); + /*SDO_API*/ void setIsAbstract(bool value); + /*SDO_API*/ void setIsExtendedPrimitive(bool value); + /*SDO_API*/ void setIsFromList(bool value); + /*SDO_API*/ void setIsQName(bool value); + /*SDO_API*/ void setIsMany(bool value); + + /*SDO_API*/ int getGroupElementCount() const; + + private : + TypeDefinitionImpl *typedefinition; + void copy(const TypeDefinition& td); + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_TYPEDefinition_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionImpl.cpp new file mode 100644 index 0000000000..31a64a91da --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionImpl.cpp @@ -0,0 +1,43 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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/TypeDefinitionImpl.h" +namespace commonj +{ + namespace sdo + { + TypeDefinitionImpl::TypeDefinitionImpl() + : dataType(false), + isOpen(false), + isSequenced(false), + isMany(false), + isQName(false), + isAbstract(false), + groupElementCount(0), + isExtendedPrimitive(false), + isFromList(false) + { + } + + TypeDefinitionImpl::~TypeDefinitionImpl() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionImpl.h new file mode 100644 index 0000000000..2a4f8e90cf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionImpl.h @@ -0,0 +1,81 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#ifndef _TYPEDefinitionImpl_H_ +#define _TYPEDefinitionImpl_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/PropertyDefinitionImpl.h" +#include "list" + + +namespace commonj +{ + namespace sdo + { + + typedef std::list<PropertyDefinitionImpl> XmlDasPropertyDefs; + +/** + * TypeDefinitionImpl holds information gathered from parsing the + * XSD and used for creating Types + */ + class TypeDefinitionImpl + { + + public: + TypeDefinitionImpl(); + virtual ~TypeDefinitionImpl(); + + + SDOXMLString uri; + SDOXMLString name; + SDOXMLString localname; + + SDOXMLString aliases; + + SDOXMLString parentTypeUri; + SDOXMLString parentTypeName; + bool isRestriction; + + SDOXMLString IDPropertyName; + + bool dataType; + XmlDasPropertyDefs properties; + + bool isOpen; + bool isSequenced; + bool isAbstract; + + bool isExtendedPrimitive; + + bool isFromList; + + + bool isMany; + int groupElementCount; + + bool isQName; + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_TYPEDefinitionImpl_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitions.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitions.cpp new file mode 100644 index 0000000000..2bea93494c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitions.cpp @@ -0,0 +1,81 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + + + +#include "commonj/sdo/TypeDefinitions.h" +#include "commonj/sdo/TypeDefinitionsImpl.h" + +namespace commonj +{ + namespace sdo + { + TypeDefinitions::TypeDefinitions() + { + typedefinitions = new TypeDefinitionsImpl(); + } + + TypeDefinitions::~TypeDefinitions() + { + if (typedefinitions != 0) delete typedefinitions; + } + + void TypeDefinitions::copy (const TypeDefinitions& tds) + { + if (typedefinitions != 0) delete typedefinitions; + typedefinitions = new TypeDefinitionsImpl(*(tds.typedefinitions)); + } + + TypeDefinitions::TypeDefinitions(const TypeDefinitions& tds) + { + copy(tds); + } + + TypeDefinitions& TypeDefinitions::operator=(const TypeDefinitions& tds) + { + if (this != &tds) + { + copy(tds); + } + return *this; + } + + void TypeDefinitions::addTypeDefinition(TypeDefinition& t) + { + if (typedefinitions == 0) + { + typedefinitions = new TypeDefinitionsImpl(); + } + + typedefinitions->types[ + typedefinitions->getTypeQName( + t.getUri(),t.getName())] = (TypeDefinitionImpl&)(*t.getTypeDefinition()); + } + + TypeDefinitionsImpl& TypeDefinitions::getTypeDefinitions() + { + if (typedefinitions == 0) + { + typedefinitions = new TypeDefinitionsImpl(); + } + return *typedefinitions; + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitions.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitions.h new file mode 100644 index 0000000000..4b95fe8b94 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitions.h @@ -0,0 +1,62 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _TYPEDefinitions_H_ +#define _TYPEDefinitions_H_ + + +#include "commonj/sdo/TypeDefinition.h" +#include "map" + +namespace commonj +{ + namespace sdo + { + + class TypeDefinitionsImpl; + +/** + * TypeDefinitionsImpl holds a list information gathered from parsing the + * XSD and used for creating Types + */ + class SDO_API TypeDefinitions + { + + public: + /*SDO_API*/ TypeDefinitions(); + TypeDefinitions(const TypeDefinitions& tds); + TypeDefinitions& operator=(const TypeDefinitions& tds); + + /*SDO_API*/ virtual ~TypeDefinitions(); + + /*SDO_API*/ void addTypeDefinition(TypeDefinition& t); + + TypeDefinitionsImpl& getTypeDefinitions(); + + private: + TypeDefinitionsImpl* typedefinitions; + void copy(const TypeDefinitions& tds); + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_TYPEDefinitions_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionsImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionsImpl.cpp new file mode 100644 index 0000000000..82fd8ac11b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionsImpl.cpp @@ -0,0 +1,39 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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/TypeDefinitionsImpl.h" +namespace commonj +{ + namespace sdo + { + TypeDefinitionsImpl::TypeDefinitionsImpl() + { + } + + TypeDefinitionsImpl::~TypeDefinitionsImpl() + { + } + + SDOXMLString TypeDefinitionsImpl::getTypeQName(const SDOXMLString& typeUri, const SDOXMLString& typeName) + { + return typeUri + "#" + typeName; + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionsImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionsImpl.h new file mode 100644 index 0000000000..b523a3316a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeDefinitionsImpl.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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$ */ + +#ifndef _TYPEDefinitionsImpl_H_ +#define _TYPEDefinitionsImpl_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/TypeDefinitionImpl.h" +#include "map" + +namespace commonj +{ + namespace sdo + { + typedef std::map<SDOXMLString, TypeDefinitionImpl> XMLDAS_TypeDefs; + +/** + * TypeDefinitionsImpl holds a list information gathered from parsing the + * XSD and used for creating Types + */ + class TypeDefinitionsImpl + { + + public: + TypeDefinitionsImpl(); + virtual ~TypeDefinitionsImpl(); + static SDOXMLString getTypeQName(const SDOXMLString& typeUri, const SDOXMLString& typeName); + + + XMLDAS_TypeDefs types; + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_TYPEDefinitionsImpl_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeImpl.cpp new file mode 100644 index 0000000000..041f492a55 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeImpl.cpp @@ -0,0 +1,3719 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 13:47:39 $ */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "commonj/sdo/Logger.h" + +#include "commonj/sdo/PropertyImpl.h" +#include "commonj/sdo/TypeImpl.h" + +#include <iostream> +#include <wchar.h> +#include <stdio.h> +using namespace std; + +#include <list> +#include <vector> +using namespace std; + +#include "commonj/sdo/SDORuntimeException.h" + +namespace commonj{ +namespace sdo{ + + + + char* TypeImpl::types[num_types] = { + "Other Types", + "BigDecimal", + "BigInteger", + "Boolean" , + "Byte", + "Bytes", + "Character", + "Date" , + "Double" , + "Float" , + "Integer" , + "Long" , + "Short" , + "String" , + "URI" , + "DataObject", + "ChangeSummary", + "Text", + "OpenDataObject" + }; + + + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + + void TypeImpl::addChangeSummary(void) + { + changeSummaryType = true; + } + + bool TypeImpl::isChangeSummaryType() const + { + return changeSummaryType; + } + + + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + + bool TypeImpl::isFromList() const + { + return bFromList; + } + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + + bool TypeImpl::isDataType(void) const + { + return isPrimitive; + } + + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + + TypeImpl::TypeImpl(const TypeImpl& t) + { + isResolving = false; + isResolved = false; + brestriction = t.brestriction; + bFromList = t.bFromList; + } + + TypeImpl::TypeImpl(const Type* base, const char* uri, + const char* inname, + bool isSeq, + bool isOp, + bool isAbs, + bool isData, + bool isRestriction) + { + init(uri,inname,isSeq,isOp, isAbs, isData); + baseType = (TypeImpl*)base; + brestriction = isRestriction; + bFromList = false; + } + + TypeImpl::TypeImpl(const char* uri, const char* inname, + bool isSeq, + bool isOp, + bool isAbs, + bool isData, + bool isFromList) + + { + init(uri,inname,isSeq,isOp,isAbs, isData); + baseType = 0; + brestriction = false; + bFromList= false; + bFromList = isFromList; + } + + void TypeImpl::init(const char* uri, const char* inname, + bool isSeq, + bool isOp, + bool isAbs, + bool isData) + { + isResolving = false; + isResolved = false; + localPropsSize = 0; + changeSummaryType = false; + isSequenced = isSeq; + isOpen = isOp; + isAbstract = isAbs; + isPrimitive = isData; + name = new char[strlen(inname)+1]; + strcpy(name,inname); + + if (uri == 0) + { + typeURI = new char[1]; + typeURI[0] = 0; + typeEnum = DataObjectType; + return; + } + + typeURI = new char[strlen(uri)+1]; + strcpy(typeURI,uri); + + if (!strcmp(uri,Type::SDOTypeNamespaceURI.c_str())) { + for (int i = 0; i < num_types ; i++) { + if (!strcmp(inname,types[i])) { + typeEnum = (Types)i; + if (i <= UriType) isPrimitive = true; + // Note - you could create Text, but it would + // not be recognised as primitive. + return; + } + } + } + + // All other types are data object types - for now + typeEnum = DataObjectType; + } + + + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + TypeImpl::TypeImpl() + { + } + + /////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////// + + TypeImpl::~TypeImpl() + { + // Types free their corresponding properties, but not the types + // of those properties + // Need to free only those we allocated + unsigned int count = 0, start = props.size() - localPropsSize; + std::list<PropertyImpl*>::iterator i; + for (i= props.begin(); i != props.end() ; ++i) + { + if (count >= start) { + delete(*i); + } + count++; + } + if (name != 0)delete name; + if (typeURI != 0) delete typeURI; + for (unsigned int j = 0; j < aliases.size();j++) + { + delete aliases[j]; + } + } + + /////////////////////////////////////////////////////////////////////////// + // Sets a data type as sequenced. + /////////////////////////////////////////////////////////////////////////// + + void TypeImpl::setSequenced(bool set) + { + isSequenced = set; + } + + /////////////////////////////////////////////////////////////////////////// + // Sets a data type as open. + /////////////////////////////////////////////////////////////////////////// + + void TypeImpl::setOpen(bool set) + { + isOpen = set; + } + + /////////////////////////////////////////////////////////////////////////// + // Sets a data type as open. + /////////////////////////////////////////////////////////////////////////// + + void TypeImpl::setBaseType(const Type* bt, bool isRestriction) + { + baseType = (TypeImpl*)bt; + brestriction = isRestriction; + + // DataType and Sequenced must be the same as the base Type + isPrimitive = baseType->isPrimitive; + if (isPrimitive) + { + typeEnum = baseType->typeEnum; + } + + if (isSequenced && !baseType->isSequenced) + { + // Its an error to be sequenced and inherit from a + // non-sequenced type + string msg("Cannot be sequenced and inherit from a non-sequenced base type:"); + msg += getURI(); + msg += " "; + msg += getName(); + SDO_THROW_EXCEPTION("setBaseType", + SDOUnsupportedOperationException, + msg.c_str()); + } + + isSequenced = baseType->isSequenced; + // if the base is open then this type must be open too. + + if (baseType->isOpenType()) + { + isOpen = true; + } + } + + bool TypeImpl::equals(const Type& tother) const + { + if (strcmp(typeURI,tother.getURI())) return false; + // TODO - aliases + if (strcmp(name, tother.getName())) return false; + return true; + } + + + const Type* TypeImpl::getBaseType() const + { + return (Type*)baseType; + } + + /////////////////////////////////////////////////////////////////////////// + // Returns the name of the type. + /////////////////////////////////////////////////////////////////////////// + + const char* TypeImpl::getName() const + { + return name; + } + + void TypeImpl::setAlias(const char* alias) + { + char* tmp = new char[strlen(alias)+1]; + strcpy(tmp,alias); + aliases.push_back(tmp); + } + + + + + const char* TypeImpl::getAlias(unsigned int index) const + { + if (index < aliases.size()) + { + return aliases[index]; + } + return name; + } + + unsigned int TypeImpl::getAliasCount() const + { + return aliases.size(); + } + /////////////////////////////////////////////////////////////////////////// + // Returns the namespace URI of the type. + /////////////////////////////////////////////////////////////////////////// + const char* TypeImpl::getURI() const + { + return typeURI; + } + + void TypeImpl::throwIfNestedChangeSummary() const + { + PROPERTY_LIST::const_iterator i; + for (i = props.begin(); i != props.end(); ++i) + { + + const TypeImpl *t = ((*i)->getTypeImpl()); + if (t != 0) + { + if (t->isDataObjectType()) + { + if (t->isChangeSummaryType()) + { + string msg(" Nested change summary type:"); + msg += t->getURI(); + msg += " "; + msg += t->getName(); + SDO_THROW_EXCEPTION("resolve", + SDOUnsupportedOperationException, + msg.c_str()); + } + t->throwIfNestedChangeSummary(); + } + } + } + } + + void TypeImpl::validateChangeSummary() + { + if (!isChangeSummaryType()) return; + throwIfNestedChangeSummary(); + } + + PROPERTY_LIST TypeImpl::getCompoundProperties() + { + return props; + } + + void TypeImpl::initCompoundProperties() + { + // We have already met this type in the resolution heirarchy + if (isResolving) + { + string msg(" circular type dependency on:"); + msg += getURI(); + msg += " "; + msg += getName(); + + SDO_THROW_EXCEPTION("initCompoundProperties", + SDOUnsupportedOperationException, + msg.c_str()); + } + + if (isResolved) + { + return; + } + + isResolving = true; + + + if (baseType != 0) + { + baseType->initCompoundProperties(); + PROPERTY_LIST pl = baseType->getCompoundProperties(); + localPropsSize = props.size(); + + // spec says the properties which are common are taken from + // the superclass. I imagine this will change , and only the + // ones taken from the subclass will be used. + + if (brestriction) + { + // restrict the properties to only those which + // appear in the parent + std::list<PropertyImpl*>::iterator p1,p; + for (p=pl.begin();p!=pl.end();++p) + { + for (p1=props.begin();p1!=props.end();++p1) + { + if (!strcmp((*p1)->getName(), + (*p)->getName())) + { + props.erase(p1); + localPropsSize = props.size(); + break; + } + } + } + + } + + props.insert(props.begin(),pl.begin(), pl.end()); + + isPrimitive = !(baseType->isDataObjectType()); + } + if (isPrimitive && (props.size() > 0)) + { + string msg("Add property to data type:"); + msg += getURI(); + msg += " "; + msg += getName(); + SDO_THROW_EXCEPTION("initCompoundProperties", + SDOUnsupportedOperationException, + msg.c_str()); + } + isResolved = true; + isResolving = false; + return; + } + + + /////////////////////////////////////////////////////////////////////////// + // Returns the list of the properties of this type. + /////////////////////////////////////////////////////////////////////////// + PropertyList TypeImpl::getProperties() const + { + return props; + } + + unsigned int TypeImpl::getPropertiesSize() const + { + return props.size(); + } + + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified name. + /////////////////////////////////////////////////////////////////////////// + const Property& TypeImpl::getProperty(const char* propertyName) const + { + PropertyImpl* pi = getPropertyImpl(propertyName); + if (pi == 0) + { + string msg("Property not found:"); + msg += propertyName; + SDO_THROW_EXCEPTION("getProperty", + SDOPropertyNotFoundException, msg.c_str()); + } + return (Property&)*pi; + } + const Property& TypeImpl::getProperty(const SDOString& propertyName) const + { + PropertyImpl* pi = getPropertyImpl(propertyName); // ??? GMW + if (pi == 0) + { + string msg("Property not found:"); + msg += propertyName; + SDO_THROW_EXCEPTION("getProperty", + SDOPropertyNotFoundException, msg.c_str()); + } + return (Property&)*pi; + } + + + /////////////////////////////////////////////////////////////////////////// + // Substitute Support - get the real underlying type + /////////////////////////////////////////////////////////////////////////// + + const Type& TypeImpl::getRealPropertyType(const char* propertyName) const + { + const TypeImpl* ti = getRealPropertyTypeImpl(propertyName); + if (ti != 0)return (Type&)*ti; + + string msg("Property not found:"); + msg += propertyName; + SDO_THROW_EXCEPTION("getProperty", + SDOPropertyNotFoundException, msg.c_str()); + + } + + + const TypeImpl* TypeImpl::getRealPropertyTypeImpl(const char* propertyName) const + { + + std::list<PropertyImpl*>::const_iterator i; + for (i = props.begin(); i != props.end(); ++i) + { + if (!strcmp(propertyName,(*i)->getName())) + { + return ((*i)->getTypeImpl()); + } + for (unsigned int k=0;k < (*i)->getAliasCount(); k++) + { + if (!strcmp(propertyName,(*i)->getAlias(k))) + { + return ((*i)->getTypeImpl()); + } + } + for (unsigned int j=0;j < (*i)->getSubstitutionCount(); j++) + { + if (!strcmp(propertyName,(*i)->getSubstitutionName(j))) + { + return (TypeImpl*)(*i)->getSubstitutionType(j); + } + } + } + return 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified name. + /////////////////////////////////////////////////////////////////////////// + PropertyImpl* TypeImpl::getPropertyImpl(const char* propertyName) const + { + + // Extension - find the property from an xpath + // not very elegant, but it will do. + // you should not be able to have "." and "[" before a "/" - this is assumed. + + if (propertyName == 0 || strlen(propertyName) == 0) return 0; + + char* tokenend = (char*) strchr(propertyName,'/'); + char * bracket = (char*) strchr(propertyName,'['); + char* dot = (char*) strchr(propertyName,'.'); + char* copy; + + + int len = strlen(propertyName); + if (tokenend != 0) + { + len = tokenend - propertyName; + if (bracket != 0 && bracket < tokenend) len = bracket - propertyName; + if (dot != 0 && dot < tokenend) len = dot - propertyName; + } + else + { + if (bracket != 0) len = bracket - propertyName; + if (dot != 0) len = dot - propertyName; + } + if (len != 0) + { + copy = new char[len+1]; + strncpy(copy, propertyName,len); + copy[len] = 0; + } + else + { + copy = new char[strlen(propertyName)+1]; + strcpy(copy,propertyName); + } + + std::list<PropertyImpl*>::const_iterator i; + for (i = props.begin(); i != props.end(); ++i) + { + if (!strcmp(copy,(*i)->getName())) + { + delete copy; + if (tokenend && strlen(tokenend) > 1) + { + const TypeImpl* ti = (*i)->getTypeImpl(); + if (ti != 0) + { + PropertyImpl* p = ti-> + getPropertyImpl((const char *)(tokenend+1)); + return p; + } + else + { + return (PropertyImpl*)(*i); + } + } + else { + return (PropertyImpl*)(*i); + } + } + for (unsigned int j=0;j < (*i)->getSubstitutionCount(); j++) + { + if (!strcmp(copy,(*i)->getSubstitutionName(j))) + { + delete copy; + if (tokenend && strlen(tokenend) > 1) + { + const TypeImpl* ti = (*i)->getTypeImpl(); + if (ti != 0) + { + PropertyImpl* p = ti-> + getPropertyImpl((const char *)(tokenend+1)); + return p; + } + else + { + return (PropertyImpl*)(*i); + } + } + else { + return (PropertyImpl*)(*i); + } + } + } + for (unsigned int k=0;k < (*i)->getAliasCount(); k++) + { + if (!strcmp(copy,(*i)->getAlias(k))) + { + delete copy; + if (tokenend && strlen(tokenend) > 1) + { + const TypeImpl* ti = (*i)->getTypeImpl(); + if (ti != 0) + { + PropertyImpl* p = ti-> + getPropertyImpl((const char *)(tokenend+1)); + return p; + } + else + { + return (PropertyImpl*)(*i); + } + } + else { + return (PropertyImpl*)(*i); + } + } + } + } + return 0; + } + // +++ + PropertyImpl* TypeImpl::getPropertyImpl(const SDOString& propertyName) const + { + + // Extension - find the property from an xpath + // you should not be able to have both "." and "[" before a "/" - this is assumed. + + if (propertyName.length() == 0) return 0; + + // strchr returns NULL if target not found + // find_first_of returns string::npos in that case + // find_first_of returns the subscript of the character found eg 0 if it is the first + size_t tokenend = propertyName.find_first_of('/'); + size_t bracket = propertyName.find_first_of('['); + size_t dot = propertyName.find_first_of('.'); + size_t dotOrBracketOrSlash = propertyName.find_first_of(".[/"); + SDOString copy; + // char* copy; + + int len = propertyName.length(); + if (dotOrBracketOrSlash != string::npos) + { + len = dotOrBracketOrSlash; + } + + if (len != 0) + { + copy.assign(propertyName, 0, len); + } + else + { + copy = propertyName; + } + + std::list<PropertyImpl*>::const_iterator i; + for (i = props.begin(); i != props.end(); ++i) + { + if (!strcmp(copy.c_str(),(*i)->getName())) // ie the two strings are the same + { + // delete copy; + if ((tokenend != string::npos) && (propertyName.length() - tokenend) > 1) + { + // There is someting to the right of the "/" + const TypeImpl* ti = (*i)->getTypeImpl(); + if (ti != 0) + { + PropertyImpl* p = ti->getPropertyImpl(SDOString(propertyName, tokenend + 1)); + return p; + } + else + { + return (PropertyImpl*)(*i); + } + } + else { + return (PropertyImpl*)(*i); + } + } + + for (unsigned int j = 0; j < (*i)->getSubstitutionCount(); j++) + { + if (!strcmp(copy.c_str(), (*i)->getSubstitutionName(j))) // ie the two strings are the same + { + // delete copy; + if ((tokenend != string::npos) && (propertyName.length() - tokenend) > 1) + { + // There is someting to the right of the "/" + const TypeImpl* ti = (*i)->getTypeImpl(); + if (ti != 0) + { + // PropertyImpl* p = ti->getPropertyImpl((const char *)(tokenend+1)); + PropertyImpl* p = ti->getPropertyImpl(SDOString(propertyName, tokenend + 1)); + return p; + } + else + { + return (PropertyImpl*)(*i); + } + } + else { + return (PropertyImpl*)(*i); + } + } + } + for (unsigned int k = 0; k < (*i)->getAliasCount(); k++) + { + if (!strcmp(copy.c_str(), (*i)->getAlias(k))) // ie the two strings are the same + { + // delete copy; + if ((tokenend != string::npos) && (propertyName.length() - tokenend) > 1) + { + const TypeImpl* ti = (*i)->getTypeImpl(); + if (ti != 0) + { + // PropertyImpl* p = ti->getPropertyImpl((const char *)(tokenend+1)); + PropertyImpl* p = ti->getPropertyImpl(SDOString(propertyName, tokenend + 1)); + return p; + } + else + { + return (PropertyImpl*)(*i); + } + } + else { + return (PropertyImpl*)(*i); + } + } + } + } + return 0; + } + + // --- + + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified name. + /////////////////////////////////////////////////////////////////////////// + PropertyImpl* TypeImpl::getPropertyImplPure(const char* propertyName) const + { + + + std::list<PropertyImpl*>::const_iterator i; + for (i = props.begin(); i != props.end(); ++i) + { + if (!strcmp(propertyName,(*i)->getName())) + { + return (PropertyImpl*)(*i); + } + for (unsigned int k=0;k < (*i)->getAliasCount(); k++) + { + if (!strcmp(propertyName,(*i)->getAlias(k))) + { + return (PropertyImpl*)(*i); + } + } + } + return 0; + } + + + /////////////////////////////////////////////////////////////////////////// + // Returns the property index with the specified name. + /////////////////////////////////////////////////////////////////////////// + unsigned int TypeImpl::getPropertyIndex(const char* propertyName) const + { + std::list<PropertyImpl*>::const_iterator i; + int j = 0; + for (i = props.begin(); i != props.end(); ++i) + { + if (!strcmp(propertyName,(*i)->getName())) + { + return j; + } + j++; + } + string msg("Property not found:"); + msg += propertyName; + SDO_THROW_EXCEPTION("getPropertyIndex", + SDOPropertyNotFoundException, msg.c_str()); + } + unsigned int TypeImpl::getPropertyIndex(const SDOString& propertyName) const + { + std::list<PropertyImpl*>::const_iterator i; + int j = 0; + for (i = props.begin(); i != props.end(); ++i) + { + if (!strcmp(propertyName.c_str(), (*i)->getName())) + { + return j; + } + j++; + } + string msg("Property not found:"); + msg += propertyName; + SDO_THROW_EXCEPTION("getPropertyIndex", + SDOPropertyNotFoundException, msg.c_str()); + } + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified name. + /////////////////////////////////////////////////////////////////////////// + const Property& TypeImpl::getProperty(unsigned int index) const + { + PropertyImpl* pi = getPropertyImpl(index); + if (pi == 0) + { + string msg("Property not found for index:"); + msg += index; + SDO_THROW_EXCEPTION("getProperty" , + SDOPropertyNotFoundException, msg.c_str()); + } + return (Property&)*pi; + } + + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified index. + /////////////////////////////////////////////////////////////////////////// + PropertyImpl* TypeImpl::getPropertyImpl(unsigned int index) const + { + std::list<PropertyImpl*>::const_iterator i; + int count = 0; + for (i = props.begin() ; i != props.end() ; ++i) + { + if (count == index)return (PropertyImpl*)(*i); + count++; + } + return 0; + } + + + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified name. + /////////////////////////////////////////////////////////////////////////// + void TypeImpl::addProperty(const char* propname, + const TypeImpl& t, + bool many, bool rdonly, bool cont) + { + + props.insert(props.end(),new PropertyImpl(*this, + propname, t, many,rdonly, cont)); + localPropsSize++; + + } + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this Type specifies DataObjects.. + /////////////////////////////////////////////////////////////////////////// + bool TypeImpl::isDataObjectType() const + { + return !isPrimitive; + } + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this Type specifies Sequenced DataObjects. + /////////////////////////////////////////////////////////////////////////// + bool TypeImpl::isSequencedType() const + { + return isSequenced; + } + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this Type allows any form of open content. + /////////////////////////////////////////////////////////////////////////// + bool TypeImpl::isOpenType() const + { + /* TODO - handle open types */ + return isOpen; + } + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this type may not be instantiated. + /////////////////////////////////////////////////////////////////////////// + bool TypeImpl::isAbstractType() const + { + return isAbstract; + } + + void TypeImpl::setAbstract(bool set) + { + isAbstract = set; + } + + /////////////////////////////////////////////////////////////////////////// + // TODO - override ==. + /////////////////////////////////////////////////////////////////////////// + bool TypeImpl::equals(const Type& t) + { + return ( strcmp(getName(),t.getName()) == 0 + && strcmp(getURI (),t.getURI ()) == 0 ); + } + + /////////////////////////////////////////////////////////////////////////// + // getTypeEnum. + /////////////////////////////////////////////////////////////////////////// + Type::Types TypeImpl::getTypeEnum(void) const + { + return typeEnum; + } + + + /////////////////////////////////////////////////////////////////////////// + // Conversions. + // convert is used in the process of setting a value. The input is the + // result of a setXXX, so in the first case setBoolean. The typeEnum is the + // type of the value being set and governs the expected final result in + // the value* buffer. + /////////////////////////////////////////////////////////////////////////// + + unsigned int TypeImpl::convert(void** value,const bool b) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0)delete (char*)(*value); + *value = new char[sizeof(long)]; + *(long*)*value = (long)b; + return sizeof(long); + + case LongType: + if (*value != 0)delete (char*)(*value); + *value = new char[sizeof(int64_t)]; + *(int64_t*)*value = (int64_t)b; + return sizeof(int64_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + if (*value != 0)delete (char*)(*value); + // spec change - types + *value = new wchar_t[6]; + if (b) + { + ((wchar_t*)(*value))[0] = (wchar_t)'t'; + ((wchar_t*)(*value))[1] = (wchar_t)'r'; + ((wchar_t*)(*value))[2] = (wchar_t)'u'; + ((wchar_t*)(*value))[3] = (wchar_t)'e'; + ((wchar_t*)(*value))[4] = 0; + return 4; + } + else + { + ((wchar_t*)(*value))[0] = (wchar_t)'f'; + ((wchar_t*)(*value))[1] = (wchar_t)'a'; + ((wchar_t*)(*value))[2] = (wchar_t)'l'; + ((wchar_t*)(*value))[3] = (wchar_t)'s'; + ((wchar_t*)(*value))[4] = (wchar_t)'e'; + ((wchar_t*)(*value))[5] = 0; + return 5; + } + break; + + + case BytesType: + { + if (*value != 0)delete (char*)(*value); + // spec change - types + *value = new char[6]; + if (b) + { + strcpy((char*)*value, "true"); + return 4; + } + else + { + strcpy((char*)*value, "false"); + return 5; + } + break; + + } + + case DoubleType: + case FloatType: + case DateType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Boolean on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setBoolean" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + unsigned int TypeImpl::convert(void** value,const char c) const + { +#if __WORDSIZE ==64 + return convert(value,(int64_t)c); +#else + return convert(value,(long)c); +#endif + } + + unsigned int TypeImpl::convert(void** value,const wchar_t c) const + { +#if __WORDSIZE ==64 + return convert(value,(int64_t)c); +#else + return convert(value,(long)c); +#endif + } + + // This is set CString... + unsigned int TypeImpl::convert(void** value,const char* c) const + { + + switch (typeEnum) + { + case BooleanType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if ((c == 0) || strcmp(c,"true")) + { + *(long*)*value = 0; + } + else + { + *(long*)*value = 1; + } + return sizeof(long); + + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long)]; + *(long*)*value = atoi(c); + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long double)]; + // TODO - atof not suitable here + *(long double*)*value = (long double)atof(c); + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(float)]; + *(float*)*value = (float)atof(c); + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(int64_t)]; +#if defined(WIN32) || defined (_WINDOWS) + *(int64_t*)*value = (int64_t)_atoi64(c); +#else + *(int64_t*)*value = (int64_t)strtoll(c, NULL, 0); +#endif + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)atoi(c); + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (*value != 0) delete ((wchar_t*)*value); + wchar_t* vw = new wchar_t[strlen(c)+1]; + for (unsigned int i=0;i< strlen(c);i++) + { + vw[i] = (wchar_t)c[i]; + } + vw[strlen(c)] = 0; + *value = (void*)vw; + return strlen(c); + } + break; + case BytesType: + { + if (*value != 0) delete ((char*)*value); + char* vc = new char[strlen(c)+1]; + for (unsigned int i=0;i< strlen(c);i++) + { + vc[i] = (char)c[i]; + } + vc[strlen(c)] = 0; + *value = (void*)vc; + return strlen(c); + } + break; + + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set CString on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setString" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + // +++ + + // This is set CString... + // The value supplied in s is converted and written to value. + unsigned int TypeImpl::convert(void** value, const SDOString& c) const + { + switch (typeEnum) + { + case BooleanType: + if (*value != 0) delete ((char*) *value); + *value = new char[sizeof(long)]; + + if (c == "true") + { + *(long*)*value = 0; + } + else + { + *(long*)*value = 1; + } + return sizeof(long); + + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + + *value = new char[sizeof(long)]; + *(long*)*value = atoi(c.c_str()); + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + + *value = new char[sizeof(long double)]; + // TODO - atof not suitable here + *(long double*)*value = (long double)atof(c.c_str()); + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + + *value = new char[sizeof(float)]; + *(float*)*value = (float)atof(c.c_str()); + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + + *value = new char[sizeof(int64_t)]; +#if defined(WIN32) || defined (_WINDOWS) + *(int64_t*)*value = (int64_t)_atoi64(c.c_str()); +#else + *(int64_t*)*value = (int64_t)strtoll(c.c_str(), NULL, 0); +#endif + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)atoi(c.c_str()); + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (*value != 0) delete ((wchar_t*)*value); + wchar_t* vw = new wchar_t[c.length() + 1]; + for (unsigned int i = 0; i < c.length(); i++) + { + vw[i] = (wchar_t)c[i]; + } + vw[c.length()] = 0; + *value = (void*)vw; + return c.length(); + } + break; + case BytesType: + { + if (*value != 0) delete ((char*)*value); + char* vc = new char[c.length() + 1]; + for (unsigned int i = 0; i < c.length(); i++) + { + vc[i] = (char)c[i]; + } + vc[c.length()] = 0; + *value = (void*)vc; + return c.length(); + } + break; + + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set CString on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setString" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + + // --- + + // setString + unsigned int TypeImpl::convert(void** value,const wchar_t* b, unsigned int len) const + { + unsigned int i; + switch (typeEnum) + { + case BigDecimalType: + case BigIntegerType: + case UriType: + case StringType: + { + if (*value != 0) delete ((wchar_t*)*value); + wchar_t* vw = new wchar_t[len+1]; + for (i=0;i<len;i++) + { + vw[i] = b[i]; + } + vw[len] = 0; + *value = (void*)vw; + return len; + } + break; + + case BytesType: + { + if (*value != 0) delete ((char*)*value); + char* vc = new char[len+1]; + for (i=0;i<len;i++) + { + vc[i] = (char)b[i]; + } + vc[len] = 0; + *value = (void*)vc; + return len; + } + break; + + case BooleanType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if (len > 4) + { + *(long*)*value = 0; + } + else + { + if (b[0] == (wchar_t)'t' && + b[1] == (wchar_t)'r' && + b[2] == (wchar_t)'u' && + b[3] == (wchar_t)'e' ) + *(long*)*value = 1; + else *(long*)*value = 0; + } + return sizeof(long); + + case CharacterType: + case ByteType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if (len > 0) + { + *(long*)*value = (long)b[0]; + } + else + { + *(long*)*value = (long)0; + } + return sizeof(long); + + case ShortType: + case IntegerType: + { + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + int val = 0; + for (unsigned int j=0;j<len;j++) + { + val += (1+ (10*j)) * ((char)b[len-1-j] - (char)'0'); + } + *(long*)*value = (long)val; + return sizeof(long); + } + + case LongType: + { + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + int64_t val = 0; + for (unsigned int j=0;j<len;j++) + { + val += (int64_t)(1+ (10*j)) * ((char)b[len-1-j] - (char)'0'); + } + *(int64_t*)*value = (int64_t)val; + return sizeof(long); + } + case DoubleType: + case FloatType: + case DateType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set String on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setString" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + // setBytes + unsigned int TypeImpl::convert(void** value,const char* b, unsigned int len) const + { + unsigned int i; + switch (typeEnum) + { + case BytesType: + { + if (*value != 0) delete ((char*)*value); + char* vc = new char[len+1]; + for (i=0;i<len;i++) + { + vc[i] = (char)b[i]; + } + vc[len] = 0; + *value = (void*)vc; + return len; + } + + case BigDecimalType: + case BigIntegerType: + case UriType: + case StringType: + { + if (*value != 0) delete ((wchar_t*)*value); + wchar_t* vw = new wchar_t[len+1]; + for (i=0;i<len;i++) + { + vw[i] = b[i]; + } + vw[len] = 0; + *value = (void*)vw; + return len; + } + + case BooleanType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if (len > 4) + { + *(long*)*value = 0; + } + else + { + if (b[0] == (char)'t' && + b[1] == (char)'r' && + b[2] == (char)'u' && + b[3] == (char)'e' ) + *(long*)*value = 1; + else *(long*)*value = 0; + } + return sizeof(long); + + case ByteType: + case CharacterType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if (len > 0) + { + *(long*)*value = (long)b[0]; + } + else + { + *(long*)*value = (long)0; + } + return sizeof(long); + + case IntegerType: + case ShortType: + { + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + int val = 0; + for (unsigned int j=0;j<len;j++) + { + val += (1+ (10*j)) * ((char)b[len-1-j] - (char)'0'); + } + *(long*)*value = (long)val; + return sizeof(long); + } + + case LongType: + { + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + int64_t val = 0; + for (unsigned int j=0;j<len;j++) + { + val += (int64_t)(1+ (10*j)) * ((char)b[len-1-j] - (char)'0'); + } + *(int64_t*)*value = (int64_t)val; + return sizeof(long); + } + + case DoubleType: + case FloatType: + case DateType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Bytes on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setBytes" , + SDOInvalidConversionException, msg.c_str()); + return 0; + } + } + return 0; + } + + // +++ + + unsigned int TypeImpl::convert(void** value, const SDOString& b, unsigned int len) const + { + unsigned int i; + switch (typeEnum) + { + case BytesType: + { + if (*value != 0) delete ((char*)*value); + + char* vc = new char[len + 1]; + b.copy(vc, len); + vc[len] = 0; + + *value = (void*)vc; + return len; + } + + case BigDecimalType: + case BigIntegerType: + case UriType: + case StringType: + { + if (*value != 0) delete ((wchar_t*)*value); + + wchar_t* vw = new wchar_t[len+1]; + // Can't use std::string.copy() because we are copying into wchar_t elements. + for (i=0;i<len;i++) + { + vw[i] = b[i]; + } + vw[len] = 0; + *value = (void*)vw; + return len; + } + + case BooleanType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if (len > 4) + { + *(long*)*value = 0; + } + else + { + if (b == "true") + *(long*)*value = 1; + else *(long*)*value = 0; + } + return sizeof(long); + + case ByteType: + case CharacterType: + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + if (len > 0) + { + *(long*)*value = (long)b[0]; + } + else + { + *(long*)*value = (long)0; + } + return sizeof(long); + + case IntegerType: + case ShortType: + { + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(long)]; + int val = 0; + for (unsigned int j=0;j<len;j++) + { + val += (1+ (10*j)) * ((char)b[len-1-j] - (char)'0'); + } + *(long*)*value = (long)val; + return sizeof(long); + } + + case LongType: + { + if (*value != 0)delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + int64_t val = 0; + for (unsigned int j=0;j<len;j++) + { + val += (int64_t)(1+ (10*j)) * ((char)b[len-1-j] - (char)'0'); + } + *(int64_t*)*value = (int64_t)val; + return sizeof(long); + } + + case DoubleType: + case FloatType: + case DateType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Bytes on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setBytes" , + SDOInvalidConversionException, msg.c_str()); + return 0; + } + } + return 0; + } + + // --- + + unsigned int TypeImpl::convert(void** value,const short s) const + { +#if __WORDSIZE ==64 + return convert(value,(int64_t)s); +#else + return convert(value,(long)s); +#endif + } + +/* unsigned int TypeImpl::convert(void** value,const int i) const + { + return convert(value,(long)i); + } +*/ + unsigned int TypeImpl::convertDate(void** value, const SDODate i) const + { + switch (typeEnum) + { + case BooleanType: + { + string msg("Cannot set Date on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setDate" , + SDOInvalidConversionException, msg.c_str()); + break; + } + default: +#if __WORDSIZE ==64 + return convert(value, (int64_t)(i.getTime())); +#else + return convert(value, (long)(i.getTime())); +#endif + } + } + +#if __WORDSIZE !=64 + // setInteger + unsigned int TypeImpl::convert(void** value,const long i) const + { +#if ! defined(WIN32) && ! defined (_WINDOWS) + char *tmp = new char[MAX_LONG_SIZE]; + int j = 0; +#endif + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long)]; + *(long*)*value = (long)i; + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long double)]; + *(long double*)*value = (long double)i; + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(float)]; + *(float*)*value = (float)i; + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + *(int64_t*)*value = (int64_t)i; + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)i; + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (*value != 0) delete ((wchar_t*)*value); + *value = new wchar_t[MAX_LONG_SIZE]; + // TODO - whats the equivalent of _ltow on linux? +#if defined(WIN32) || defined (_WINDOWS) + _ltow(i,(wchar_t*)*value,10); + return wcslen((wchar_t*)(*value)); +#else + sprintf(tmp,"%d", i); + for (j=0; j< strlen(tmp); j++) + { + ((wchar_t*)(*value))[j] = (wchar_t)tmp[j]; + } + ((wchar_t*)(*value))[strlen(tmp)] = 0; + delete tmp; + return j; +#endif + + } + + case BytesType: + { + if (*value != 0) delete ((wchar_t*)*value); + *value = new char[MAX_LONG_SIZE]; + // TODO - whats the equivalent of _ltow on linux? + sprintf((char*)*value,"%d", i); + return strlen((char*)(*value)); + + } + + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Integer on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setInteger" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + +#endif + + // setLongLong + + unsigned int TypeImpl::convert(void** value,const int64_t l) const + { +#if ! defined(WIN32) && ! defined (_WINDOWS) + char *tmp = new char[MAX_LONG_SIZE]; + int j = 0; +#endif + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long)]; + *(long*)*value = (long)l; + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long double)]; + *(long double*)*value = (long double)l; + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(float)]; + *(float*)*value = (float)l; + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + *(int64_t*)*value = (int64_t)l; + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)l; + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (*value != 0) delete ((wchar_t*)*value); + *value = new wchar_t[MAX_LONG_SIZE]; + // TODO - whats the equivalent of _ltow on linux? +#if defined(WIN32) || defined (_WINDOWS) + _i64tow(l,(wchar_t*)*value,10); + return wcslen((wchar_t*)(*value)); +#else + sprintf(tmp, "%lld", l); + for (j=0; j< strlen(tmp); j++) + { + ((wchar_t*)(*value))[j] = (wchar_t)tmp[j]; + } + ((wchar_t*)(*value))[strlen(tmp)] = 0; + delete tmp; + return j; +#endif + + } + + case BytesType: + { + if (*value != 0) delete ((char*)*value); + *value = new char[MAX_LONG_SIZE]; +#if defined(WIN32) || defined (_WINDOWS) + _i64toa(l,(char*)*value,10); +#else + sprintf((char*)*value, "%lld", l); +#endif + return strlen((char*)(*value)); + + } + + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set LongLong on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setLongLong" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + // setFloat + unsigned int TypeImpl::convert(void** value,const float f) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long)]; + *(long*)*value = (long)f; + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long double)]; + *(long double*)*value = (long double)f; + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(float)]; + *(float*)*value = (float)f; + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + *(int64_t*)*value = (int64_t)f; + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)f; + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + case BytesType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Float on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setFloat" , + SDOInvalidConversionException, msg.c_str()); + break; + } + break; + } + } + + // TODO - storing the double as a long double - perhaps I need + // a new type? +/* unsigned int TypeImpl::convert(void** value,const double d) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long)]; + *(long*)*value = (long)d; + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long double)]; + *(long double*)*value = (long double)d; + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(float)]; + *(float*)*value = (float)d; + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + *(int64_t*)*value = (int64_t)d; + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)d; + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + case BytesType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Double on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setDouble" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } +*/ + unsigned int TypeImpl::convert(void** value,const long double d) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long)]; + *(long*)*value = (long)d; + return sizeof(long); + + case DoubleType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(long double)]; + *(long double*)*value = (long double)d; + return sizeof(long double); + + case FloatType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(float)]; + *(float*)*value = (float)d; + return sizeof(float); + + case LongType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(int64_t)]; + *(int64_t*)*value = (int64_t)d; + return sizeof(int64_t); + + case DateType: + if (*value != 0) delete ((char*)*value); + *value = new char[sizeof(time_t)]; + *(time_t*)*value = (time_t)d; + return sizeof(time_t); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + case BytesType: + case OtherTypes: + case DataObjectType: + case ChangeSummaryType: + default: + { + string msg("Cannot set Long Double on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setLongDouble" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + unsigned int TypeImpl::convert(void** value,DataObject* dob) const + { + switch (typeEnum) + { + + case OtherTypes: + case DataObjectType: + *(DataObject**)value = dob; + return sizeof (void*); + + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + case DoubleType: + case FloatType: + case LongType: + case DateType: + case BigDecimalType: + case BigIntegerType: + case StringType: + case BytesType: + case UriType: + default: + { + string msg("Cannot set Data Object on object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("setDataObject" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + unsigned int TypeImpl::convertToString(void* value, wchar_t* outval, unsigned int len, + unsigned int max) const + { +#if ! defined(WIN32) && ! defined (_WINDOWS) + char* tmpstr = new char[MAX_LONG_SIZE]; + int j = 0; +#endif + unsigned int i; + switch (typeEnum) + { + + case BigDecimalType: + case BigIntegerType: + case UriType: + case StringType: + { + if (value == 0) return 0; + wchar_t* tmp = (wchar_t*)value; + for (i=0;(i < len) && (i < max);i++) + { + outval[i] = tmp[i]; + } + return len>max?max:len; + } + case BytesType: + { + if (value == 0) return 0; + char* tmp = (char*)value; + for (i=0;(i < len) && (i < max);i++) + { + outval[i] = (wchar_t)(tmp[i]); + } + return len>max?max:len; + } + + case BooleanType: + { + if (max < 4) return 0; + if (value == 0 || *(long*)value == 0) { + if (max < 5) return 0; + outval[0] = (wchar_t)'f'; + outval[1] = (wchar_t)'a'; + outval[2] = (wchar_t)'l'; + outval[3] = (wchar_t)'s'; + outval[4] = (wchar_t)'e'; + return 5; + } + else + { + outval[0] = (wchar_t)'t'; + outval[1] = (wchar_t)'r'; + outval[2] = (wchar_t)'u'; + outval[3] = (wchar_t)'e'; + return 4; + } + } + + case ByteType: + { + if (value == 0) return 0; + long tmp = *(long*)value; + outval[0] = (wchar_t)(tmp&0xFF); + return 1; + } + + case CharacterType: + { + if (value == 0) return 0; + long tmp = *(long*)value; + outval[0] = (wchar_t)(tmp & 0xFFFF); + return 1; + } + + case ShortType: + case IntegerType: + { + if (value == 0) return 0; + long tmp = *(long*)value; +#if defined(WIN32) || defined (_WINDOWS) + wchar_t* tmpstr = new wchar_t[MAX_LONG_SIZE]; + _ltow(tmp,tmpstr,10); + if (wcslen(tmpstr) > max) return 0; + _ltow(tmp,outval,10); + return wcslen(outval); +#else + sprintf(tmpstr, "%ld", tmp); + if (strlen(tmpstr) > max) return 0; + for (j=0; j< strlen(tmpstr); j++) + { + outval[j] = (wchar_t)tmpstr[j]; + } + delete tmpstr; + return j; +#endif + } + + + case LongType: + { + if (value == 0) return 0; + int64_t tmp = *(int64_t*)value; +#if defined(WIN32) || defined (_WINDOWS) + wchar_t* tmpstr = new wchar_t[MAX_LONG_SIZE]; + _i64tow(tmp,tmpstr,10); + if (wcslen(tmpstr) > max) + { + delete tmpstr; + return 0; + } + _i64tow(tmp,outval,10); + return wcslen(outval); +#else + sprintf(tmpstr, "%lld", tmp); + if (strlen(tmpstr) > max) return 0; + for (j=0; j< strlen(tmpstr); j++) + { + outval[j] = (wchar_t)tmpstr[j]; + } + delete tmpstr; + return j; +#endif + } + + case DateType: + { + + if (value == 0) return 0; + string msg("Conversion to string not implemented from type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getString" , + SDOInvalidConversionException, msg.c_str()); + break; + } + + case DoubleType: + { + if (value == 0) return 0; + if (max < MAX_DOUBLE_SIZE) return 0; + wchar_t* fmt = new wchar_t[5]; + fmt[0] = (wchar_t)'%'; + fmt[1] = (wchar_t)'.'; + fmt[2] = (wchar_t)'3'; + fmt[3] = (wchar_t)'e'; + fmt[4] = (wchar_t)0; +#if defined(WIN32) || defined (_WINDOWS) + swprintf((wchar_t*)outval,fmt,*(long double*)value); +#else +#if defined(NO_SWPRINTF) + { + int k; + char *tmpbuf = new char[50]; + wchar_t *tmpw = (wchar_t*)outval; + sprintf(tmpbuf,"%.3Le",*(long double*)value); + for (k=0;k<strlen(tmpbuf);k++) + { + *(tmpw++) = (wchar_t)(tmpbuf[k]); + } + *tmpw = 0; + delete tmpbuf; + } + +#else + swprintf((wchar_t*)outval, wcslen((wchar_t*)outval), fmt, *(long double*)value); +#endif +#endif + delete fmt; + + return wcslen(outval); + } + case FloatType: + { + if (value == 0) return 0; + if (max < MAX_FLOAT_SIZE) return 0; + wchar_t* fmt = new wchar_t[5]; + fmt[0] = (wchar_t)'%'; + fmt[1] = (wchar_t)'.'; + fmt[2] = (wchar_t)'3'; + fmt[3] = (wchar_t)'e'; + fmt[4] = (wchar_t)0; +#if defined(WIN32) || defined (_WINDOWS) + swprintf(outval,fmt,*(float*)value); +#else +#if defined(NO_SWPRINTF) + { + int k; + char *tmpbuf = new char[50]; + wchar_t *tmpw = (wchar_t*)outval; + sprintf(tmpbuf,"%.3e",*(float*)value); + for (k=0;k<strlen(tmpbuf);k++) + { + *(tmpw++) = (wchar_t)(tmpbuf[k]); + } + *tmpw = 0; + delete tmpbuf; + } +#else + swprintf(outval, wcslen(outval), fmt, *(float*)value); +#endif +#endif + delete fmt; + + return wcslen(outval); + } + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get String from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getString" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + return 0; + } + + unsigned int TypeImpl::convertToBytes(void* value, char* outval, unsigned int len, + unsigned int max) const + { + unsigned int i; + switch (typeEnum) + { + case BytesType: + { + if (value == 0) return 0; + char* tmp = (char*)value; + for (i=0;(i < max) && (i < len);i++) + { + outval[i] = tmp[i]; + } + return len>max?max:len; + } + + case BigDecimalType: + case BigIntegerType: + case UriType: + case StringType: + { + if (value == 0) return 0; + wchar_t* tmp = (wchar_t*)value; + for (i=0;(i < max) && (i < len);i++) + { + outval[i] = (char)(tmp[i]); + } + return len>max?max:len; + } + + case BooleanType: + { + if (value == 0 || *(long*)value == 0) { + if (max < 5) return 0; + outval[0] = 'f'; + outval[1] = 'a'; + outval[2] = 'l'; + outval[3] = 's'; + outval[4] = 'e'; + return 5; + } + else { + if (max < 4) return 0; + outval[0] = 't'; + outval[1] = 'r'; + outval[2] = 'u'; + outval[3] = 'e'; + return 4; + } + return 0; + } + + case CharacterType: + case ByteType: + { + if (value == 0) return 0; + long tmp = *(long*)value; + outval[0] = (char)(tmp&0xFF); + return 1; + } + + case ShortType: + case IntegerType: + { + if (value == 0) return 0; + long tmp = *(long*)value; + char* tmpstr = new char[MAX_LONG_SIZE]; + sprintf(tmpstr, "%ld", tmp); + if (strlen(tmpstr) > max) + { + delete tmpstr; + return 0; + } + delete tmpstr; + sprintf(outval, "%ld", tmp); + return strlen(outval); + } + + + case LongType: + { + if (value == 0) return 0; + int64_t tmp = *(int64_t*)value; + char * tmpstr = new char[MAX_LONG_SIZE]; + sprintf(tmpstr, "%lld", tmp); + if (strlen(tmpstr) > max) + { + delete tmpstr; + return 0; + } + delete tmpstr; + sprintf(outval, "%lld", tmp); + return strlen(outval); + } + case DateType: + { + if (value == 0) return 0; + string msg("Conversion to string not implemented from type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getBytes" , + SDOInvalidConversionException, msg.c_str()); + break; + } + + case DoubleType: + if (value == 0) return 0; + if (max < MAX_DOUBLE_SIZE) return 0; + sprintf(outval,"%.3Le",*(long double*)value); + return strlen(outval); + + case FloatType: + if (value == 0) return 0; + if (max < MAX_FLOAT_SIZE) return 0; + sprintf(outval,"%.3e",*(float*)value); + return strlen(outval); + + case OtherTypes: + case DataObjectType: + default: + { + if (max < 9) return 0; + sprintf(outval,"%08x",value); + //string msg("Cannot get Bytes from object of type:"); + //msg += getName(); + //SDO_THROW_EXCEPTION("getBytes" , + // SDOInvalidConversionException, msg.c_str()); + return strlen(outval); + } + } + return 0; + } + + // +++ + + // value is a pointer to the byte stream that is the value to convert + // outval is the resulting string representation of value + // len is the length of the input byte stream, it is used only when the length cannot be inferred from other information. + // max is the maximum size allowed for the output byte stream. (Not strictly needed when the output is an std::string but we maintain the behaviour from the earlier method. + + // Questions + // 1. Why isn't value const? + // + unsigned int TypeImpl::convertToBytes(const void* value, + SDOString& outval, + unsigned int len, + unsigned int max) const + { + unsigned int i; + switch (typeEnum) + { + case BytesType: + { + if (value == 0) return 0; + + const char* tempPtr = (const char*) value; + unsigned int count = (len > max) ? max : len; + outval.assign(tempPtr, count); + + return count; + } + + case BigDecimalType: + case BigIntegerType: + case UriType: + case StringType: + { + if (value == 0) return 0; + + const wchar_t* tempPtr = (const wchar_t*) value; + unsigned int count = (len > max) ? max : len; + + // The following loop copies the low byte from each 2 byte wchar_t + // into one byte of the target array eg H_E_L_P -> HELP + for (i = 0; (i < count); i++) + { + outval[i] = (char)(tempPtr[i]); + } + return count; + } + + case BooleanType: + { + if (value == 0 || *(const long*)value == 0) { + if (max < 5) return 0; + outval = "false"; + return 5; + } + else { + if (max < 4) return 0; + outval = "true"; + return 4; + } + return 0; + } + + case CharacterType: + case ByteType: + { + if (value == 0) return 0; + + const long tmp = *(const long*)value; + outval[0] = (char)(tmp&0xFF); + return 1; + } + + case ShortType: + case IntegerType: + { + if (value == 0) return 0; + + const long tmp = *(const long*) value; + char* tmpstr = new char[MAX_LONG_SIZE + 1]; + sprintf(tmpstr, "%ld", tmp); + if (strlen(tmpstr) > max) + { + delete tmpstr; + return 0; + } + outval = tmpstr; + delete tmpstr; + return outval.length(); + } + + case LongType: + { + if (value == 0) return 0; + + const int64_t tmp = *(const int64_t*)value; + char* tmpstr = new char[MAX_LONG_SIZE + 1]; + sprintf(tmpstr, "%lld", tmp); + if (strlen(tmpstr) > max) + { + delete tmpstr; + return 0; + } + outval = tmpstr; + delete tmpstr; + return outval.length(); + } + case DateType: + { + if (value == 0) return 0; + + string msg("Conversion to string not implemented from type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getBytes" , + SDOInvalidConversionException, msg.c_str()); + break; + } + + case DoubleType: + { + if (value == 0) return 0; + + if (max < MAX_DOUBLE_SIZE) return 0; + + char* tmpstr = new char[MAX_DOUBLE_SIZE + 1]; + sprintf(tmpstr, "%.3Le", *(const long double*)value); + outval = tmpstr; + delete tmpstr; + return outval.length(); + } + + case FloatType: + { + if (value == 0) return 0; + + if (max < MAX_FLOAT_SIZE) return 0; + + char* tmpstr = new char[MAX_FLOAT_SIZE + 1]; + sprintf(tmpstr, "%.3Le", *(const float*)value); + outval = tmpstr; + delete tmpstr; + return outval.length(); + } + + case OtherTypes: + case DataObjectType: + default: + { + if (max < 9) return 0; + + char tmpstr[9]; + sprintf(tmpstr, "%08x", value); + outval = tmpstr; + //string msg("Cannot get Bytes from object of type:"); + //msg += getName(); + //SDO_THROW_EXCEPTION("getBytes" , + // SDOInvalidConversionException, msg.c_str()); + return outval.length(); + } + } + return 0; + } + + // --- + + const char* TypeImpl::convertToCString(void* value, char** asstringbuf, unsigned int len) const + { + unsigned int i; + + switch (typeEnum) + { + case BooleanType: + if (value == 0 || *(long*)value == 0) { + *asstringbuf = new char[6]; + strcpy(*asstringbuf,"false"); + } + else { + *asstringbuf = new char[5]; + strcpy(*asstringbuf,"true"); + } + return *asstringbuf; + + case ByteType: + *asstringbuf = new char[MAX_LONG_SIZE]; + if (value == 0){ + sprintf(*asstringbuf,"%ld",0); + } + else { + sprintf(*asstringbuf,"%ld",*(long*)value); + } + return *asstringbuf; + + case CharacterType: + *asstringbuf = new char[MAX_LONG_SIZE]; + if (value == 0){ + sprintf(*asstringbuf,"%ld",0); + } + else { + sprintf(*asstringbuf,"%ld", *(long*)value); + } + return *asstringbuf; + + case IntegerType: + *asstringbuf = new char[MAX_LONG_SIZE]; + if (value == 0){ + sprintf(*asstringbuf,"%ld",0); + } + else { + sprintf(*asstringbuf,"%ld", *(long*)value); + } + return *asstringbuf; + + case ShortType: + *asstringbuf = new char[MAX_LONG_SIZE]; + if (value == 0){ + sprintf(*asstringbuf,"%ld",0); + } + else { + sprintf(*asstringbuf,"%ld", *(long*)value); + } + return *asstringbuf; + + case DoubleType: + *asstringbuf = new char[MAX_DOUBLE_SIZE]; + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + (*asstringbuf)[0] = 0; + return *asstringbuf; + } + sprintf(*asstringbuf,"%.3Le",*(long double*)value); + return *asstringbuf; + + case FloatType: + *asstringbuf = new char[MAX_FLOAT_SIZE]; + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + (*asstringbuf)[0] = 0; + return *asstringbuf; + } + sprintf(*asstringbuf,"%.3e", *(float*)value); + return *asstringbuf; + + case LongType: + { + *asstringbuf = new char[MAX_LONG_SIZE]; + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + (*asstringbuf)[0] = 0; + return *asstringbuf; + } + int64_t temp = *(int64_t*)value; +#if defined(WIN32) || defined (_WINDOWS) + sprintf(*asstringbuf,"%I64d", temp); +#else + sprintf(*asstringbuf,"%lld", temp); +#endif + return *asstringbuf; + } + case DateType: + *asstringbuf = new char[MAX_LONG_SIZE]; + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + (*asstringbuf)[0] = 0; + return *asstringbuf; + } + sprintf(*asstringbuf,"%ld", *(time_t*)value); + return *asstringbuf; + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (value == 0 || len == 0) + { + *asstringbuf = new char[1]; + (*asstringbuf)[0] = 0; + return *asstringbuf; + } + *asstringbuf = new char[len + 1]; + wchar_t* tmp = (wchar_t*)value; + for (i=0;i< len;i++) + { + (*asstringbuf)[i] = tmp[i] & 0xFF; + } + (*asstringbuf)[i] = 0; + return *asstringbuf; + } + + case BytesType: + { + if (value == 0 || len == 0) + { + *asstringbuf = new char[1]; + (*asstringbuf)[0] = 0; + return *asstringbuf; + } + *asstringbuf = new char[len + 1]; + char* tmp = (char*)value; + for (i=0;i< len ;i++) + { + (*asstringbuf)[i] = (char)(tmp[i]); + } + (*asstringbuf)[i] = 0; + return *asstringbuf; + } + + + case OtherTypes: + case DataObjectType: + default: + { + *asstringbuf = new char[9]; + sprintf(*asstringbuf,"%08x",value); + //string msg("Cannot get CString from object of type:"); + //msg += getName(); + //SDO_THROW_EXCEPTION("getCString" , + // SDOInvalidConversionException, msg.c_str()); + return *asstringbuf; + } + } + return 0; + } + + const bool TypeImpl::convertToBoolean(void* value, unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return false; + if (*(long*)value != 0) return true; + return false; + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return false; + } + if (*(long double*)value != 0.0) return true; + return false; + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return false; + } + if (*(float*)value != 0.0) return true; + return false; + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return false; + } + if (*(int64_t*)value != 0)return true; + return false; + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return false; + } + if (*(time_t*)value != 0)return true; + return false; + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + if (value == 0 || len < 4) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return false; + } + if ( ((wchar_t*)value)[0] == (wchar_t)'t' && + ((wchar_t*)value)[1] == (wchar_t)'r' && + ((wchar_t*)value)[2] == (wchar_t)'u' && + ((wchar_t*)value)[3] == (wchar_t)'e' ) + return true; + + return false; + + case BytesType: + if (value == 0 || len < 4) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return false; + } + if (!strncmp((char*)value,"true", 4)) return true; + return false; + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Boolean from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getBoolean" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + + } + + const char TypeImpl::convertToByte(void* value , unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (char)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (char)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (char)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (char)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + + return (char)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (value == 0) return 0; + return (char)*(wchar_t*)value; + } + + case BytesType: + { + if (value == 0) return 0; + return (char)*(char*)value; + } + + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Byte from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getByte" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + const wchar_t TypeImpl::convertToCharacter(void* value, unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (wchar_t)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (wchar_t)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (wchar_t)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (wchar_t)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (wchar_t)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (value == 0) return 0; + return *(wchar_t*)value; + } + + case BytesType: + { + if (value == 0) return 0; + return (wchar_t)*(char*)value; + } + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Character from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getCharacter" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + const short TypeImpl::convertToShort(void* value, unsigned int len) const + { +#if ! defined(WIN32) && !defined (_WINDOWS) + char* tmpstr = new char[len+1]; + short s = 0; +#endif + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (short)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (short)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (short)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (short)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (short)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + if (value == 0 || len == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } +#if defined(WIN32) || defined (_WINDOWS) + return (short)_wtoi((wchar_t*)value); +#else + for (int j=0;j< len;j++) + { + tmpstr[j] = (char)((char *)value)[j]; + } + tmpstr[len] = 0; + s = (short) atoi(tmpstr); + delete tmpstr; + return s; +#endif + + + case BytesType: + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Short from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getShort" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + +/* const int TypeImpl::convertToInt(void* value, unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (int)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } +#if defined(WIN32) || defined (_WINDOWS) + return (int)_wtoi((wchar_t*)value); +#else + char* tmp = new char[len+1]; + int j = 0;; + for (j=0;j<len;j++) + { + tmp[j] = (char)(wchar_t*)value[j]; + } + tmp[j] = 0; + j = atoi(tmp); + delete tmp; + return j; +#endif + + case BytesType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int)atoi((char*)value); + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Int from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getInt" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + */ + const long TypeImpl::convertToInteger(void* value, unsigned int len) const + { +#if ! defined(WIN32) && ! defined (_WINDOWS) + char* tmp = new char[len+1]; + int j = 0; + long l = 0; +#endif + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (long)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (long)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (long)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (long)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (long)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } +#if defined(WIN32) || defined (_WINDOWS) + return (long)_wtol((wchar_t*)value); +#else + for (j=0;j<len;j++) + { + tmp[j] = (char)((wchar_t*)value)[j]; + } + tmp[j] = 0; + l = atol(tmp); + delete tmp; + return l; +#endif + + case BytesType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int)atol((char*)value); + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Long from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getLong" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + const int64_t TypeImpl::convertToLong(void* value, unsigned int len) const + { +#if ! defined(WIN32) && ! defined (_WINDOWS) + char* tmp = new char[len+1]; + int j = 0; + int64_t l = 0; +#endif + switch (typeEnum) + { + case BooleanType: + case CharacterType: + case ByteType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (int64_t)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int64_t)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int64_t)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int64_t)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (int64_t)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } +#if defined(WIN32) || defined (_WINDOWS) + return (long)_wtol((wchar_t*)value); +#else + for (j=0;j<len;j++) + { + tmp[j] = (char)((wchar_t*)value)[j]; + } + tmp[j] = 0; + l = strtoll(tmp, NULL, 0); + delete tmp; + return l; +#endif + + + case BytesType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } +#if defined(WIN32) || defined (_WINDOWS) + return _atoi64((char*)value); +#else + return strtoll((char*)value, NULL, 0); +#endif + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Long Long from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getLongLong" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + const float TypeImpl::convertToFloat(void* value, unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (float)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (float)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (float)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (float)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (float)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + char* tmp = new char[len+1]; + for (unsigned int j=0;j<len;j++) + { + tmp[j] = (char)((wchar_t*)value)[j]; + } + tmp[len] = 0; + float f = atof(tmp); + delete tmp; + return f; + } + + case BytesType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (float)atof((char*)value); + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Float from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getFloat" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + /*const double TypeImpl::convertToDouble(void* value, unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (double)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (double)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (double)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (double)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (double)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + char* tmp = new char[len+1]; + int j = 0; + for (j=0;j<len;j++) + { + tmp[j] = (char)((wchar_t*)value)[j]; + } + tmp[len] = 0; + float f = atof(tmp); + delete tmp; + return (double)f; + } + case BytesType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (double)atof((char*)value); + + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get LongDouble from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getLongDouble" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } +*/ + const long double TypeImpl::convertToDouble(void* value, unsigned int len) const + { + switch (typeEnum) + { + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (long double)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (long double)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (long double)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (long double)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (long double)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + { + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + char* tmp = new char[len+1]; + for (unsigned int j=0;j<len;j++) + { + tmp[j] = (char)((wchar_t*)value)[j]; + } + tmp[len] = 0; + float f = atof(tmp); + delete tmp; + return (long double)f; + } + + case BytesType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0.0; + } + return (long double)atof((char*)value); + + case OtherTypes: + case DataObjectType: + SDO_THROW_EXCEPTION("getLongDouble" , + SDOInvalidConversionException, "Not implemented on data object"); + break; + + default: + { + string msg("Cannot get LongDouble from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getLongDouble" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + const SDODate TypeImpl::convertToDate(void* value, unsigned int len) const + { + switch (typeEnum) + { + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + if (value == 0) return 0; + return (time_t)(*(long*)value); + + case DoubleType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (time_t)(*(long double*)value); + + case FloatType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (time_t)(*(float*)value); + + case LongType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (time_t)(*(int64_t*)value); + + case DateType: + if (value == 0) + { + // Conversions might set from a zero value, as they are used + // by the default Setting code as well + return 0; + } + return (time_t)(*(time_t*)value); + + case BigDecimalType: + case BigIntegerType: + case StringType: + case UriType: + case BooleanType: + case BytesType: + case OtherTypes: + case DataObjectType: + default: + { + string msg("Cannot get Date from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getDate" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } + + DataObject* TypeImpl::convertToDataObject(void* value, unsigned int len) const + { + switch (typeEnum) + { + case OtherTypes: + case DataObjectType: + return (DataObject*)value; + + case BooleanType: + case ByteType: + case CharacterType: + case IntegerType: + case ShortType: + case DoubleType: + case FloatType: + case LongType: + case DateType: + case BigDecimalType: + case BigIntegerType: + case StringType: + case BytesType: + case UriType: + default: + { + string msg("Cannot get Data Object from object of type:"); + msg += getName(); + SDO_THROW_EXCEPTION("getDataObject" , + SDOInvalidConversionException, msg.c_str()); + break; + } + } + } +}; + +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeImpl.h new file mode 100644 index 0000000000..5a8bcec2e7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeImpl.h @@ -0,0 +1,325 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/13 08:35:04 $ */ + +#ifndef _TYPEIMPL_H_ +#define _TYPEIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + +#include <list> +#include <map> +#include <vector> +#include "commonj/sdo/DASType.h" +#include "commonj/sdo/PropertyImpl.h" +#include "commonj/sdo/SDODate.h" + + +#define MAX_LONG_SIZE 20 +#define MAX_FLOAT_SIZE 32 +#define MAX_DOUBLE_SIZE 32 +#define BOOL_SIZE 5 +#define CHAR_SIZE 1 +#define BYTE_SIZE 1 + + + +namespace commonj{ +namespace sdo{ + +class DataObject; +class PropertyList; +class MetadataGraph; + + +#ifndef PROPERTY_LIST + typedef std::list<PropertyImpl*> PROPERTY_LIST; +#endif + +/** + * TypeImpl implements the abstract class Type. + * A representation of the type of property of a data object. + */ + + +class TypeImpl : public DASType +{ + +public: + + + virtual ~TypeImpl(); + + /** convert - converts between types + * + * When a DataObject is queried for the value of one of its + * properties, the method to call varies according to the + * type of the property. + * If the wrong API is called (E.g getBoolean() called on + * an Integer value), then a conversion is attempted. + * Many conversions will succeed and return the value, + * others will throw an InvalidConversionException + */ + + unsigned int convertDate( void ** value, const SDODate i) const; + unsigned int convert( void ** value,const char* s) const; + unsigned int convert(void ** value, const SDOString& s) const; + unsigned int convert( void ** value,const wchar_t* s, unsigned int len) const; + unsigned int convert( void ** value,const char* s, unsigned int len) const; + unsigned int convert(void ** value, const SDOString& s, unsigned int len) const; + unsigned int convert( void ** value,const bool b) const; + unsigned int convert( void ** value,const char c) const; + unsigned int convert( void ** value,const wchar_t c) const; + unsigned int convert( void ** value,const short s) const; +#if __WORDSIZE !=64 + unsigned int convert( void ** value,const long i) const; +#endif + unsigned int convert( void ** value,const int64_t l) const; + unsigned int convert( void ** value,const float f) const; + unsigned int convert( void ** value,const long double d) const; + unsigned int convert( void ** value,DataObject* dob) const; + + const char* convertToCString( void* value , char** inbuf, unsigned int len) const; + const bool convertToBoolean( void* value, unsigned int len) const; + const char convertToByte( void* value,unsigned int len ) const; + unsigned int convertToString( void* value , wchar_t* val, unsigned int len, + unsigned int max) const; + unsigned int convertToBytes( void* value , char* val, unsigned int len, + unsigned int max) const; + unsigned int convertToBytes( const void* value , SDOString& val, unsigned int len, + unsigned int max) const; + const wchar_t convertToCharacter( void* value ,unsigned int len) const; + const short convertToShort( void* value ,unsigned int len) const; + const long convertToInteger( void* value ,unsigned int len) const; + const int64_t convertToLong( void* value ,unsigned int len) const; + const float convertToFloat( void* value ,unsigned int len) const; + const long double convertToDouble(void* value ,unsigned int len) const; + DataObject* convertToDataObject(void* value ,unsigned int len) const; + const SDODate convertToDate (void* value ,unsigned int len) const; + + /** equals - compares + * + * equals returns true if the name and uri are the same + */ + + bool equals(const Type& t); + + /////////////////////////////////////////////////////////////////////////// + // Returns the name of the type. + /////////////////////////////////////////////////////////////////////////// + const char* getName() const; + + /////////////////////////////////////////////////////////////////////////// + // Alias support. + // @return nth alias + /////////////////////////////////////////////////////////////////////////// + virtual const char* getAlias(unsigned int index = 0) const ; + virtual unsigned int getAliasCount() const ; + virtual void setAlias(const char* alias); + + + + /////////////////////////////////////////////////////////////////////////// + // Returns the namespace URI of the type. + /////////////////////////////////////////////////////////////////////////// + const char* getURI() const; + + /////////////////////////////////////////////////////////////////////////// + // Returns the list of the properties of this type. + /////////////////////////////////////////////////////////////////////////// + PropertyList getProperties() const; + + /////////////////////////////////////////////////////////////////////////// + // add a property to a Type whilst building - this is for DAS + /////////////////////////////////////////////////////////////////////////// + void addProperty(const char* name, + const TypeImpl& t, bool many, bool rdonly, bool cont); + + /////////////////////////////////////////////////////////////////////////// + // Returns the property with the specified name. + /////////////////////////////////////////////////////////////////////////// + const Property& getProperty(const char* propertyName) const ; + const Property& getProperty(const SDOString& propertyName) const ; + const Property& getProperty(unsigned int index) const ; + + PropertyImpl* getPropertyImpl(const char* propertyName) const ; + PropertyImpl* getPropertyImpl(const SDOString& propertyName) const ; + PropertyImpl* getPropertyImpl(unsigned int index) const ; + + + /////////////////////////////////////////////////////////////////////////// + // Substitute support + /////////////////////////////////////////////////////////////////////////// + // get the property with no substitute possible. + PropertyImpl* getPropertyImplPure(const char* propertyName) const ; + + // get the type of the property even if its a substitute + const Type& getRealPropertyType(const char* propertyName) const ; + const TypeImpl* getRealPropertyTypeImpl(const char* propertyName) const ; + + + + unsigned int getPropertyIndex(const char* propertyName) const ; + unsigned int getPropertyIndex(const SDOString& propertyName) const ; + + unsigned int getPropertiesSize() const; + /////////////////////////////////////////////////////////////////////////// + // Indicates if this Type specifies DataObjects. + /////////////////////////////////////////////////////////////////////////// + bool isDataObjectType() const; + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this Type specifies Sequenced DataObjects. + /////////////////////////////////////////////////////////////////////////// + bool isSequencedType() const; + void setSequenced(bool set); + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this Type allows any form of open content. If false, + // dataObject.getInstanceProperties() must be the same as + // DataObject.getType().getProperties(). + /////////////////////////////////////////////////////////////////////////// + bool isOpenType() const; + void setOpen(bool set); + + /////////////////////////////////////////////////////////////////////////// + // Indicates if this type may not be instantiated. + /////////////////////////////////////////////////////////////////////////// + bool isAbstractType() const; + void setAbstract(bool set); + + /////////////////////////////////////////////////////////////////////////// + // Set the base type for inherited types + /////////////////////////////////////////////////////////////////////////// + void setBaseType(const Type* tb, bool isRestriction = false); + const Type* getBaseType() const; + + + /////////////////////////////////////////////////////////////////////////// + // Indicates a non-object type + /////////////////////////////////////////////////////////////////////////// + bool isDataType() const; + + /////////////////////////////////////////////////////////////////////////// + // Indicates a non-object type + /////////////////////////////////////////////////////////////////////////// + Type::Types getTypeEnum() const; + + /////////////////////////////////////////////////////////////////////////// + // set this type as a change summary holder + /////////////////////////////////////////////////////////////////////////// + void addChangeSummary(); + + /////////////////////////////////////////////////////////////////////////// + // Say if this type is allowed to have a summary + /////////////////////////////////////////////////////////////////////////// + bool isChangeSummaryType() const; + + /////////////////////////////////////////////////////////////////////////// + // Used by the DAS to resolve the base type properties list + /////////////////////////////////////////////////////////////////////////// + void initCompoundProperties(); + + /////////////////////////////////////////////////////////////////////////// + // Used by the DAS to chack for nested change summaries + /////////////////////////////////////////////////////////////////////////// + void validateChangeSummary(); + + virtual bool equals(const Type& tother) const; + + virtual bool isFromList() const; + + +private: + friend class DataFactoryImpl; + + bool changeSummaryType; + + bool bFromList; + + void* newValue(void* v, int size) const; + + PROPERTY_LIST getCompoundProperties(); + + void throwIfNestedChangeSummary() const; + + TypeImpl(const char* uri,const char* name, + bool isSeq= false, + bool isOp = false, + bool isAbs = false, + bool isData = false, + bool isFromList = false); + + TypeImpl(const Type* base, const char* uri,const char* name, + bool isSeq = false, + bool isOp = false, + bool isAbs = false, + bool isData = false, + bool isRest = false); + + void init(const char* uri, const char* inname, + bool isSeq, + bool isOp, + bool isAbs, + bool isData); + + + + TypeImpl(); + TypeImpl(const TypeImpl& t); + + + char* name; + char* typeURI; + + + bool isPrimitive; + bool isSequenced; + bool isOpen; + bool isAbstract; + + // baseType properties included + bool isResolved; + // check for circular dependency + bool isResolving; + + Types typeEnum; + + static char* types[num_types]; + + // alias support + + std::vector<char*> aliases; + + + PROPERTY_LIST props; + + + // type inheritance + TypeImpl* baseType; + bool brestriction; /* if this is a restriction of the base type + rather than an extension.*/ + // says how many of the props are really in this data object type. + unsigned int localPropsSize; + +}; + +}; +}; + +#endif //_TYPEIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeList.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeList.cpp new file mode 100644 index 0000000000..ec86a95eb2 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeList.cpp @@ -0,0 +1,84 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/01/16 15:41:28 $ */ + +#ifndef SDO_EXPORTS + #define SDO_EXPORTS +#endif + +#include "commonj/sdo/export.h" +#include <iostream> +#include "commonj/sdo/Property.h" +#include "commonj/sdo/Type.h" +#include "commonj/sdo/TypeList.h" +#include "commonj/sdo/Logger.h" + +using namespace std; + +namespace commonj{ +namespace sdo { + + +/** TypeList provides access to a list of Types. + * + * The data factory can return a list of types available. This + * class wraps that list and provides access to Types by + * iteration + */ + +SDO_API TypeList::TypeList(std::vector<const Type*> p) : plist (p) +{ +} + +SDO_API TypeList::TypeList(const TypeList &pin) +{ + plist = std::vector<const Type*>(pin.getVec()); +} + +SDO_API TypeList::TypeList() +{ +} + +SDO_API TypeList::~TypeList() +{ +} + + +SDO_API const Type& TypeList::operator[] (int pos) const +{ + return *plist[pos]; +} + +SDO_API int TypeList::size () const +{ + return plist.size(); +} + +std::vector<const Type*> TypeList::getVec() const +{ + return plist; +} + +SDO_API void TypeList::insert (const Type* t) +{ + plist.insert(plist.end(),t); +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeList.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeList.h new file mode 100644 index 0000000000..bdc20cbfe3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/TypeList.h @@ -0,0 +1,56 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _TYPELIST_H_ +#define _TYPELIST_H_ +#include "commonj/sdo/export.h" + +#include <vector> +#include "commonj/sdo/Type.h" + +namespace commonj{ +namespace sdo +{ +class Type; + +/** TypeList - provides access to a list of Types + * + * The data factory can return a list of types available. This + * class wraps that list and provides access to Types by + * iteration + */ + +class TypeList +{ +private: + std::vector<const Type*> plist; + std::vector<const Type*> getVec() const; +public: + SDO_API TypeList(const TypeList &pin); + SDO_API TypeList(std::vector<const Type*> p); + SDO_API TypeList(); + virtual SDO_API ~TypeList(); + SDO_API const Type& operator[] (int pos) const; + SDO_API int size () const; + SDO_API void insert (const Type* t); +}; +}; +}; + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocument.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocument.cpp new file mode 100644 index 0000000000..b16b2eedff --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocument.cpp @@ -0,0 +1,31 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XMLDocument.h" +namespace commonj +{ + namespace sdo + { + + XMLDocument::~XMLDocument() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocument.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocument.h new file mode 100644 index 0000000000..4737fa9d03 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocument.h @@ -0,0 +1,145 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _XMLDOCUMENT_H_ +#define _XMLDOCUMENT_H_ + + +#include "commonj/sdo/export.h" + +#include "commonj/sdo/DataObject.h" + +namespace commonj +{ + namespace sdo + { + /** XMLDocument - place for holding a graph + * + * The XMLDocument class provides a place to hold a loaded + * graph of data. The root element name is maintained here so that + * the graph can be serialized to the same name later. + */ + + + class XMLDocument : public RefCountingObject + { + + public: + + SDO_API virtual ~XMLDocument(); + + /** getRootDataObject- return the topmost data object + * + * When XML data is loaded, there is one base element which becomes + * the root data object. As this data object is not a property of any + * other data object, it has no name + * The XMLDocument stores the name which was in the XML file. + * This root data object has a URI and a Name only within this + * XMLDocument + */ + + SDO_API virtual DataObjectPtr getRootDataObject() const = 0; + + /** getRootElementName- return the topmost data objects name + * + * When XML data is loaded, there is one base element which becomes + * the root data object. As this data object is not a property of any + * other data object, it has no name + * The XMLDocument stores the name/uri which was in the XML file. + */ + SDO_API virtual const char* getRootElementURI() const = 0; + + /** getRootElementURI- return the topmost data objects uri + * + * When XML data is loaded, there is one base element which becomes + * the root data object. As this data object is not a property of any + * other data object, it has no name + * The XMLDocument stores the name/uri which was in the XML file. + */ + SDO_API virtual const char* getRootElementName() const = 0; + + /** getEncoding- return the encoding for this document + * + * NOT IMPLEMENTED + * This returns the encoding specified in the original XML. + */ + SDO_API virtual const char* getEncoding() const = 0; + + /** setEncoding- set the encoding to save this document + * + * This sets the encoding to save this data to XML. + */ + SDO_API virtual void setEncoding(const char* encoding) = 0; + + /** getXMLDeclaration + * + * NOT IMPLEMENTED + */ + SDO_API virtual bool getXMLDeclaration() const = 0; + + /** setXMLDeclaration + * + * Sets the XMLDeclaration + */ + SDO_API virtual void setXMLDeclaration(bool xmlDeclaration) = 0; + + /** getXMLVersion- return the xml version for this document + * + * NOT IMPLEMENTED + */ + SDO_API virtual const char* getXMLVersion() const = 0; + + /** setXMLVersion- sets the version for this document + * + * NOT IMPLEMENTED + */ + SDO_API virtual void setXMLVersion(const char* xmlVersion) = 0; + + /** getSchemaLocation- return the schema location + * + * NOT IMPLEMENTED + */ + SDO_API virtual const char* getSchemaLocation() const = 0; + + /** setSchemaLocation + * + * Sets the XML Schema location. + */ + SDO_API virtual void setSchemaLocation(const char* schemaLocation) = 0; + + /** getNoNamespaceSchemaLocation + * + * NOT IMPLEMENTED + */ + SDO_API virtual const char* getNoNamespaceSchemaLocation() const = 0; + + /** setNoNamespaceSchemaLocation + * + * Sets the nonamespace schema location + */ + SDO_API virtual void setNoNamespaceSchemaLocation(const char* noNamespaceSchemaLocation) = 0; + + SDO_API friend std::istream& operator>>(std::istream& input, XMLDocument& doc); + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_XMLDOCUMENT_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocumentImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocumentImpl.cpp new file mode 100644 index 0000000000..88e93ad480 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocumentImpl.cpp @@ -0,0 +1,69 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XMLDocumentImpl.h" + +namespace commonj +{ + namespace sdo + { + XMLDocumentImpl::XMLDocumentImpl( + DataObjectPtr dob, + const char* rootURI, + const char* rootName) + : dataObject(dob), + rootElementURI(rootURI), + rootElementName(rootName), + xmlDeclaration(true), + encoding("UTF-8"), + xmlVersion("1.0") + { + } + + XMLDocumentImpl::~XMLDocumentImpl() + { + } + + void XMLDocumentImpl::setEncoding(const char* enc) + { + encoding = enc; + } + + void XMLDocumentImpl::setXMLDeclaration(bool xmlDecl) + { + xmlDeclaration = xmlDecl; + } + + void XMLDocumentImpl::setXMLVersion(const char* xmlVer) + { + xmlVersion = xmlVer; + } + + void XMLDocumentImpl::setSchemaLocation(const char* schemaLoc) + { + schemaLocation = schemaLoc; + } + + void XMLDocumentImpl::setNoNamespaceSchemaLocation(const char* noNamespaceSchemaLoc) + { + noNamespaceSchemaLocation = noNamespaceSchemaLoc; + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocumentImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocumentImpl.h new file mode 100644 index 0000000000..a799ba90f2 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLDocumentImpl.h @@ -0,0 +1,96 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _XMLDocumentImpl_H_ +#define _XMLDocumentImpl_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/XMLDocument.h" +#include "commonj/sdo/DataObject.h" +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/SDOString.h" + + +namespace commonj +{ + namespace sdo + { + +/** XMLDocumentImpl place for holding a graph + * + * The XMLDocumentImpl class implements the abstract XMLDocument. + * Provides a place to hold a loaded + * graph of data. The root element name is maintained here so that + * the graph can be serialized to the same name later. + */ + + class XMLDocumentImpl : public XMLDocument + { + + public: + XMLDocumentImpl(); + + XMLDocumentImpl( + DataObjectPtr dataObject); + + XMLDocumentImpl( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName); + + virtual ~XMLDocumentImpl(); + + virtual DataObjectPtr getRootDataObject() const {return dataObject;} + virtual const char* getRootElementURI() const {return rootElementURI;} + virtual const char* getRootElementName() const {return rootElementName;} + virtual const char* getEncoding() const {return encoding;} + virtual void setEncoding(const char* enc); + + virtual bool getXMLDeclaration() const {return xmlDeclaration;} + virtual void setXMLDeclaration(bool xmlDecl); + + virtual const char* getXMLVersion() const {return xmlVersion;} + virtual void setXMLVersion(const char* xmlVer); + + virtual const char* getSchemaLocation() const {return schemaLocation;} + virtual void setSchemaLocation(const char* schemaLoc); + + virtual const char* getNoNamespaceSchemaLocation() const { return noNamespaceSchemaLocation;} + virtual void setNoNamespaceSchemaLocation(const char* noNamespaceSchemaLoc); + + + friend std::istream& operator>>(std::istream& input, XMLDocumentImpl& doc); + private: + DataObjectPtr dataObject; + SDOXMLString rootElementURI; + SDOXMLString rootElementName; + SDOXMLString encoding; + bool xmlDeclaration; + SDOXMLString xmlVersion; + SDOXMLString schemaLocation; + SDOXMLString noNamespaceSchemaLocation; + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_XMLDocumentImpl_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelper.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelper.cpp new file mode 100644 index 0000000000..3b0648ce10 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelper.cpp @@ -0,0 +1,34 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/01/16 15:41:28 $ */ + + +#include "commonj/sdo/XMLHelper.h" +namespace commonj +{ + namespace sdo + { + ////////////////////////////////////////////////////////////////////// + // Construction/Destruction + ////////////////////////////////////////////////////////////////////// + XMLHelper::~XMLHelper() + { + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelper.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelper.h new file mode 100644 index 0000000000..f9e280583e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelper.h @@ -0,0 +1,142 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#ifndef _XMLHELPER_H_ +#define _XMLHELPER_H_ + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/XMLDocument.h" +#include "commonj/sdo/RefCountingObject.h" + +namespace commonj +{ + namespace sdo + { + /** + * + * XMLHelper provides the ability to load XML data into + * a data object graph, according to a schema + */ + + class XMLHelper : public RefCountingObject + { + public: + + /** load/loadFile - loads xml data + * + * De-serializes the specified XML file building a graph of DataObjects. + * Returns a pointer to the root data object + */ + + SDO_API virtual XMLDocumentPtr createDocument( + const char* elementname = 0, + const char* rootElementURI=0) = 0; + + SDO_API virtual XMLDocumentPtr loadFile( + const char* xmlFile, + const char* targetNamespaceURI=0) = 0; + SDO_API virtual XMLDocumentPtr load( + std::istream& inXml, + const char* targetNamespaceURI=0) = 0; + SDO_API virtual XMLDocumentPtr load( + const char* inXml, + const char* targetNamespaceURI=0) = 0; + + /** save saves the graph to XML + * + * save - Serializes the datagraph to the XML file + */ + + SDO_API virtual void save(XMLDocumentPtr doc, const char* xmlFile, + int indent = -1) = 0; + SDO_API virtual void save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + const char* xmlFile, + int indent = -1) = 0; + + + /** save saves the graph to XML + * + * save - Serializes the datagraph to the XML stream + */ + + SDO_API virtual void save(XMLDocumentPtr doc, std::ostream& outXml, + int indent = -1) = 0; + SDO_API virtual void save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + std::ostream& outXml, + int indent = -1) = 0; + + /** save saves the graph to XML + * + * save - Serializes the datagraph to a string + */ + + SDO_API virtual char* save(XMLDocumentPtr doc, int indent = -1) = 0; + SDO_API virtual char* save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + int indent = -1) = 0; + + /** createDocument creates an XMLDocument + * + * An XMLDocument holds a root data object and all its + * tree of children. This provides the means of storing the + * name to be applied to the root element when serializing + */ + + SDO_API virtual XMLDocumentPtr createDocument( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName) = 0; + + /***********************************/ + /* Destructor */ + /***********************************/ + SDO_API virtual ~XMLHelper(); + + /** getErrorCount gets number of parse errors + * + * Parser error count - the parse may have + * succeeded or partially succeeded or failed. There + * may be errors to report or handle. + */ + + virtual int getErrorCount() const = 0; + + /** getErrorMessage gets the nth error message + * + * Each error has a message, usually giving the line and file + * in which the parser error occurred. + */ + + virtual const char* getErrorMessage(int errnum) const = 0; + + + }; + } // End - namespace sdo +} // End - namespace commonj + +#endif //_XMLHELPER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelperImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelperImpl.cpp new file mode 100644 index 0000000000..b2889ac195 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelperImpl.cpp @@ -0,0 +1,308 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#include "commonj/sdo/SDOXMLFileWriter.h" // Include first to avoid libxml compile problems! +#include "commonj/sdo/SDOXMLStreamWriter.h" // Include first to avoid libxml compile problems! +#include "commonj/sdo/SDOXMLBufferWriter.h" // Include first to avoid libxml compile problems! +#include "commonj/sdo/XMLHelperImpl.h" +#include "commonj/sdo/XMLDocumentImpl.h" +#include <iostream> +#include <fstream> +#include <sstream> +#include "commonj/sdo/SDOSAX2Parser.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/XSDTypeInfo.h" +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/DataFactoryImpl.h" + + +namespace commonj +{ + namespace sdo + { + + + ////////////////////////////////////////////////////////////////////// + // Construction/Destruction + ////////////////////////////////////////////////////////////////////// + + XMLHelperImpl::XMLHelperImpl(DataFactoryPtr df) + { + dataFactory = (DataFactory*)df; + if (!dataFactory) + { + dataFactory = DataFactory::getDataFactory(); + } + } + + XMLHelperImpl::~XMLHelperImpl() + { + clearErrors(); + } + + DataFactoryPtr XMLHelperImpl::getDataFactory() + { + if (!dataFactory) + { + dataFactory = DataFactory::getDataFactory(); + } + return dataFactory; + } + + XMLDocumentPtr XMLHelperImpl::createDocument(DataObjectPtr dataObject) + { + + SDOXMLString rootElementName = ""; + SDOXMLString rootElementURI = ""; + if (dataObject) + { + // Set the root element name to the name of the containment property + // or null if there is no container + try + { + DataObjectPtr cont = dataObject->getContainer(); + if (cont != 0) + { + const Property& containmentProp = dataObject->getContainmentProperty(); + rootElementName = containmentProp.getName(); + rootElementURI = cont->getType().getURI(); + } + else + { + DataFactory* df = dataFactory; + rootElementURI = dataObject->getType().getURI(); + rootElementName = ((DataFactoryImpl*)df)->getRootElementName().c_str(); + } + } + catch (SDOPropertyNotFoundException&) + {} + } + + return new XMLDocumentImpl(dataObject, rootElementURI, rootElementName); + } + + + const TypeImpl* XMLHelperImpl::findRoot(DataFactory* df, + const char* rootElementURI) + { + if (rootElementURI != 0) + { + return ((DataFactoryImpl*)df)->findTypeImpl + (rootElementURI, "RootType"); + } + + const TypeList& tl = df->getTypes(); + for (int i=0;i<tl.size();i++) + { + if (!strcmp("RootType",tl[i].getName())) + { + return ((DataFactoryImpl*)df)->findTypeImpl + (tl[i].getURI(), "RootType"); + } + } + return 0; + } + + XMLDocumentPtr XMLHelperImpl::createDocument(const char* elementname, + const char* rootElementURI) + { + DataFactory* dp = (DataFactory*)getDataFactory(); + if (dp == 0) return 0; + + const TypeImpl* rType = findRoot(dp,rootElementURI); + if (rType == 0) + { + std::string msg("createDocument - cannot find element "); + if (elementname != 0) msg += elementname; + SDO_THROW_EXCEPTION("createDocument", SDOUnsupportedOperationException, + msg.c_str()); + } + + if ((elementname != 0) && (strlen(elementname) != 0)) + { + PropertyImpl* pl = rType->getPropertyImpl(elementname); + if (pl == 0) + { + std::string msg("createDocument - cannot find element "); + msg += elementname; + SDO_THROW_EXCEPTION("createDocument", SDOUnsupportedOperationException, + msg.c_str()); + } + + const Type& tp = pl->getType(); + DataObjectPtr dob = dp->create(tp); + return new XMLDocumentImpl(dob, + tp.getURI(), /*tp.getName()*/ elementname); + } + else + { + const Property& pl = rType->getProperty((unsigned int)0); + const Type& tp = pl.getType(); + DataObjectPtr dob = dp->create(tp); + return new XMLDocumentImpl(dob, + tp.getURI(), /*tp.getName()*/ pl.getName()); + } + + std::string msg("createDocument - unable to find root type in namespace "); + if (rootElementURI != 0) + msg += rootElementURI; + else + msg += " NULL"; + SDO_THROW_EXCEPTION("createDocument", SDOUnsupportedOperationException, + msg.c_str()); + } + + XMLDocumentPtr XMLHelperImpl::createDocument( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName) + { + return new XMLDocumentImpl(dataObject, rootElementURI, rootElementName); + } + + XMLDocumentPtr XMLHelperImpl::loadFile( + const char* xmlFile, + const char* targetNamespaceURI) + { + DataObjectPtr rootDataObject; + clearErrors(); + SDOSAX2Parser sdoParser(getDataFactory(), targetNamespaceURI, rootDataObject, + this); + if (sdoParser.parse(xmlFile) == 0) + { + return createDocument(rootDataObject); + } + return 0; + } + + + XMLDocumentPtr XMLHelperImpl::load( + std::istream& inXml, + const char* targetNamespaceURI) + { + DataObjectPtr rootDataObject; + SDOSAX2Parser sdoParser(getDataFactory(), targetNamespaceURI, rootDataObject, + this); + clearErrors(); + inXml>>sdoParser; + return createDocument(rootDataObject); + } + + XMLDocumentPtr XMLHelperImpl::load( + const char* inXml, + const char* targetNamespaceURI) + { + std::istringstream str(inXml); + return load(str, targetNamespaceURI); + } + + void XMLHelperImpl::save(XMLDocumentPtr doc, const char* xmlFile, int indent) + { + SDOXMLFileWriter writer(xmlFile, dataFactory); + writer.write(doc, indent); + } + + void XMLHelperImpl::save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + const char* xmlFile, + int indent) + { + save(createDocument(dataObject,rootElementURI, rootElementName), xmlFile, + indent); + } + + + // Serializes the datagraph to a stream + void XMLHelperImpl::save(XMLDocumentPtr doc, std::ostream& outXml, + int indent) + { + SDOXMLStreamWriter writer(outXml, dataFactory); + writer.write(doc, indent); + } + void XMLHelperImpl::save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + std::ostream& outXml, + int indent ) + { + save(createDocument(dataObject,rootElementURI, rootElementName), outXml, indent); + } + + // Serializes the datagraph to a std::string + char* XMLHelperImpl::save(XMLDocumentPtr doc, + int indent) + { + SDOXMLBufferWriter writer(dataFactory); + writer.write(doc, indent); + SDOXMLString ret = writer.getBuffer(); + char* retString = new char[strlen(ret) +1]; + strcpy(retString, ret); + return retString; + } + char* XMLHelperImpl::save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + int indent) + { + return save(createDocument(dataObject,rootElementURI, rootElementName), + indent); + } + + int XMLHelperImpl::getErrorCount() const + { + return parseErrors.size(); + } + + + const char* XMLHelperImpl::getErrorMessage(int errnum) const + { + if (errnum >= 0 && errnum < parseErrors.size()) + { + return parseErrors[errnum]; + } + return 0; + } + + void XMLHelperImpl::setError(const char* message) + { + if (message == 0) return; + char * m = new char[strlen(message) + 1]; + strcpy(m,message); + m[strlen(message)] = 0; + parseErrors.push_back(m); + } + + void XMLHelperImpl::clearErrors() + { + while (!parseErrors.empty()) + { + if (*parseErrors.begin() != 0) + { + delete (char*)(*parseErrors.begin()); + } + parseErrors.erase(parseErrors.begin()); + } + } + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelperImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelperImpl.h new file mode 100644 index 0000000000..302a9e5072 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLHelperImpl.h @@ -0,0 +1,143 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#ifndef _XMLHELPERIMPL_H_ +#define _XMLHELPERIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/XMLHelper.h" +#include "commonj/sdo/export.h" +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/SchemaInfo.h" +#include "commonj/sdo/TypeDefinitionsImpl.h" +#include "commonj/sdo/ParserErrorSetter.h" + +namespace commonj +{ + namespace sdo + { + + /** + * + * XMLHelperImpl is the implementation of the abstract class + * XMLHelper. + * Provides the ability to load XML data into + * a data object graph, according to a schema + */ + + class XMLHelperImpl : public XMLHelper, ParserErrorSetter + { + public: + // Constructor + XMLHelperImpl(DataFactoryPtr dataFactory); + + // Destructor + virtual ~XMLHelperImpl(); + + virtual int getErrorCount() const; + virtual const char* getErrorMessage(int errnum) const; + virtual void setError(const char* error); + + + /** load/loadFile - loads xml data + * + * De-serializes the specified XML file building a graph of DataObjects. + * Returns a pointer to the root data object + */ + + virtual XMLDocumentPtr createDocument( + const char* elementname= 0, + const char* rootElementURI=0); + + virtual XMLDocumentPtr loadFile( + const char* xmlFile, + const char* targetNamespaceURI = 0); + virtual XMLDocumentPtr load( + std::istream& inXml, + const char* targetNamespaceURI = 0); + virtual XMLDocumentPtr load( + const char* inXml, + const char* targetNamespaceURI = 0); + + virtual XMLDocumentPtr createDocument( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName); + + /** save saves the graph to XML + * + * save - Serializes the datagraph to the XML file + */ + + void save(XMLDocumentPtr doc, const char* xmlFile, int indent = -1); + void save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + const char* xmlFile, int indent = -1); + + /** save saves the graph to XML + * + * save - Serializes the datagraph to a stream + */ + + void save(XMLDocumentPtr doc, std::ostream& outXml, + int indent = -1); + void save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + std::ostream& outXml, + int indent = -1); + + /** save saves the graph to XML + * + * save - Serializes the datagraph to a string + */ + char* save(XMLDocumentPtr doc,int indent = -1); + char* save( + DataObjectPtr dataObject, + const char* rootElementURI, + const char* rootElementName, + int indent = -1); + + private: + int parse(const char* source); + void clearErrors(); + + std::vector<char*> parseErrors; + + // Instance variables + DataFactoryPtr dataFactory; + SDOXMLString targetNamespaceURI; + + XMLDocumentPtr createDocument(DataObjectPtr dataObject); + + const TypeImpl* findRoot(DataFactory* df, + const char* rootElementURI); + + DataFactoryPtr getDataFactory(); + }; + + } // End - namespace sdo +} // End - namespace commonj + +#endif // _XMLHELPERIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLQName.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLQName.cpp new file mode 100644 index 0000000000..de03d3affb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLQName.cpp @@ -0,0 +1,84 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XMLQName.h" +namespace commonj +{ + namespace sdo + { + + + XMLQName::XMLQName() + { + } + + XMLQName::XMLQName(const SDOXMLString& sdouri) + { + int index = sdouri.lastIndexOf('#'); + if (index < 0) + { + localName = sdouri; + } + else + { + uri = sdouri.substring(0, index); + localName = sdouri.substring(index+1); + } + } + + XMLQName::XMLQName( + const SDOXMLString& qname, + const SAX2Namespaces& globalNamespaces, + const SAX2Namespaces& localNamespaces) + { + SDOXMLString prefix; + + int index = qname.firstIndexOf(':'); + if (index < 0) + { + localName = qname; + } + else + { + prefix = qname.substring(0, index); + localName = qname.substring(index+1); + } + + const SDOXMLString* namespaceURI = localNamespaces.find(prefix); + if (namespaceURI == 0) + { + namespaceURI = globalNamespaces.find(prefix); + } + if (namespaceURI != 0) + { + uri = *namespaceURI; + } + + } + + XMLQName::~XMLQName() + { + } + + SDOXMLString XMLQName::getSDOName() const + { + return uri + "#" + localName; + } + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLQName.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLQName.h new file mode 100644 index 0000000000..9548a737d0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XMLQName.h @@ -0,0 +1,66 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _XMLQName_H_ +#define _XMLQName_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/DataObject.h" + +namespace commonj +{ + namespace sdo + { + +/** XMLQname wraps a qualified name + * + * This class holds a QName and provides access to its + * members + */ + + class XMLQName + { + + public: + XMLQName(); + XMLQName(const SDOXMLString& sdoUri); + XMLQName( + const SDOXMLString& qname, + const SAX2Namespaces& globalNamespaces, + const SAX2Namespaces& localNamespaces = SAX2Namespaces()); + + SDOXMLString getSDOName() const ; + const SDOXMLString& getURI() const {return uri;} + const SDOXMLString& getLocalName() const {return localName;} + virtual ~XMLQName(); + + private: + SDOXMLString uri; + SDOXMLString localName; + + + }; + } // End - namespace sdo +} // End - namespace commonj + + +#endif //_XMLQName_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelper.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelper.cpp new file mode 100644 index 0000000000..6c9ce98127 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelper.cpp @@ -0,0 +1,35 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XSDHelper.h" + +namespace commonj +{ + namespace sdo + { + + + XSDHelper::~XSDHelper() + { + } + + + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelper.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelper.h new file mode 100644 index 0000000000..9457176e89 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelper.h @@ -0,0 +1,130 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#ifndef _XSDHELPER_H_ +#define _XSDHELPER_H_ + + +#include "commonj/sdo/export.h" +#include "commonj/sdo/RefCountingObject.h" +#include "commonj/sdo/DataFactory.h" +#include "commonj/sdo/TypeDefinitions.h" + +namespace commonj +{ + namespace sdo + { + + /** + * + * XSDHelper provides the means of loading and saving XSD information + * from/to the metadata (Types and properties) + */ + + class XSDHelper : public RefCountingObject + { + public: + + /** define builds types/properties from file or stream + * + * define/defineFile + * + * Populates the data factory with Types and Properties from the schema + * Loads from file, stream or char* buffer. + * The return value is the URI of the root Type + * + */ + + SDO_API virtual const char* defineFile(const char* schemaFile) = 0; + SDO_API virtual const char* define(std::istream& schema) = 0; + SDO_API virtual const char* define(const char* schema) = 0; + + + /** generate buildsXSD from types/properties + * + * generate/generateFile + * + * Saves the types/properties to an XSD stream or file + * + */ + + SDO_API virtual char* generate( + const TypeList& types, + const char* targetNamespaceURI = "", + int indent = -1) = 0; + SDO_API virtual void generate( + const TypeList& types, + std::ostream& outXsd, + const char* targetNamespaceURI = "", + int indent = -1) = 0; + SDO_API virtual void generateFile( + const TypeList& types, + const char* fileName, + const char* targetNamespaceURI = "", + int indent = -1) = 0; + + /***********************************/ + /* Destructor */ + /***********************************/ + SDO_API virtual ~XSDHelper(); + + /** getDataFactory() + * + * Return the DataFactory + */ + + SDO_API virtual DataFactoryPtr getDataFactory() = 0; + + /** getRootTypeURI + * + * Return the URI for the root Type + */ + + SDO_API virtual const char* getRootTypeURI() = 0; + + /** getErrorCount gets number of parse errors + * + * Parser error count - the parse may have + * succeeded or partially succeeded or failed. There + * may be errors to report or handle. + */ + + virtual int getErrorCount() const = 0; + + /** getErrorMessage gets the nth error message + * + * Each error has a message, usually giving the line and file + * in which the parser error occurred. + */ + + virtual const char* getErrorMessage(int errnum) const = 0; + + /** + * + * used for defining types from type definitions + */ + + SDO_API virtual void defineTypes(TypeDefinitions& types) = 0; + + + }; + }//End - namespace sdo +} // End - namespace commonj + +#endif //_XSDHELPER_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelperImpl.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelperImpl.cpp new file mode 100644 index 0000000000..7b918c576e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelperImpl.cpp @@ -0,0 +1,589 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/04/18 12:33:33 $ */ + +#include "commonj/sdo/SDOXMLFileWriter.h" // Include first to avoid libxml compile problems! +#include "commonj/sdo/SDOXMLStreamWriter.h" // Include first to avoid libxml compile problems! +#include "commonj/sdo/SDOXMLBufferWriter.h" // Include first to avoid libxml compile problems! +#include "commonj/sdo/SDOXSDFileWriter.h" +#include "commonj/sdo/SDOXSDStreamWriter.h" +#include "commonj/sdo/SDOXSDBufferWriter.h" +#include "commonj/sdo/XSDHelperImpl.h" +#include "commonj/sdo/XMLDocumentImpl.h" +#include <iostream> +#include <fstream> +#include <sstream> +#include "commonj/sdo/SDOSchemaSAX2Parser.h" +#include "commonj/sdo/SDOSAX2Parser.h" +#include "commonj/sdo/XSDPropertyInfo.h" +#include "commonj/sdo/XSDTypeInfo.h" + +#include "commonj/sdo/SDORuntimeException.h" +#include "commonj/sdo/DASProperty.h" +#include "commonj/sdo/Logging.h" +#include "commonj/sdo/Type.h" + +namespace commonj +{ + namespace sdo + { + + /** XSDHelperImpl + * + * XSDHelperImpl is the implementation of the abstract class + * XSDHelper. + * Provides the means of loading and saving XSD information + * from/to the metadata (Types and properties) + */ + + XSDHelperImpl::XSDHelperImpl(DataFactoryPtr df) + { + dataFactory = (DataFactory*)df; + if (!dataFactory) + { + dataFactory = DataFactory::getDataFactory(); + } + } + + XSDHelperImpl::~XSDHelperImpl() + { + clearErrors(); + } + + /** define builds types/properties from file or stream + * + * define/defineFile + * + * Populates the data factory with Types and Properties from the schema + * Loads from file, stream or char* buffer. + * The return value is the URI of the root Type + * + */ + + const char* XSDHelperImpl::defineFile(const char* schema) + { + + SDOSchemaSAX2Parser schemaParser(schemaInfo, this); + clearErrors(); + if (schemaParser.parse(schema) == 0) + { + defineTypes(schemaParser.getTypeDefinitions()); + return schemaInfo.getTargetNamespaceURI(); + } + return 0; + } + + const char* XSDHelperImpl::define(std::istream& schema) + { + SDOSchemaSAX2Parser schemaParser(schemaInfo, this); + clearErrors(); + schema >> schemaParser; + defineTypes(schemaParser.getTypeDefinitions()); + return schemaInfo.getTargetNamespaceURI(); + } + + const char* XSDHelperImpl::define(const char* schema) + { + std::istringstream str(schema); + SDOSchemaSAX2Parser schemaParser(schemaInfo, this); + clearErrors(); + str >> schemaParser; + defineTypes(schemaParser.getTypeDefinitions()); + return schemaInfo.getTargetNamespaceURI(); + return define(str); + } + + void XSDHelperImpl::newSubstitute(const char* entryName, + PropertyDefinitionImpl& prop) + { + try + { + const char* typeUri = prop.substituteUri.isNull() ? + prop.typeUri : prop.substituteUri; + const Type& rootType = dataFactory->getType(typeUri, entryName); + PropertyList pl = rootType.getProperties(); + for (int j = 0; j < pl.size(); j++) + { + if (!pl[j].getType().isDataType() + && strcmp(pl[j].getType().getURI(),Type::SDOTypeNamespaceURI.c_str())) + { + // recurse the tree.. + newSubstitute(pl[j].getType().getName(), + prop); + + if (!strcmp(pl[j].getName(),prop.substituteName)) + { + dataFactory->setPropertySubstitute(rootType.getURI(), + rootType.getName(), + pl[j].getName(), + prop.name, + typeUri, + prop.typeName); + XSDPropertyInfo* pi = (XSDPropertyInfo*) + ((DASProperty*)&pl[j])->getDASValue("XMLDAS::PropertyInfo"); + if (pi) + { + PropertyDefinitionImpl& propdef = (PropertyDefinitionImpl&)pi->getPropertyDefinition(); + propdef.substituteNames.push_back(prop.name); + propdef.substituteLocalNames.push_back(prop.localname); + } + + } + + } + } + } + catch (const SDORuntimeException&) + { + } + } + + void XSDHelperImpl::addSubstitutes(PropertyDefinitionImpl& prop, + TypeDefinitionImpl& ty) + { + try + { + const char* typeUri = prop.substituteUri.isNull() ? + ty.uri : prop.substituteUri; + DataFactoryImpl* df = (DataFactoryImpl*)(DataFactory*)dataFactory; + const Type* rootType = df->findType(typeUri,"RootType"); + if (rootType == 0) return; + PropertyList pl = rootType->getProperties(); + for (int j = 0; j < pl.size(); j++) + { + XSDPropertyInfo* pi = (XSDPropertyInfo*) + ((DASProperty*)&pl[j])->getDASValue("XMLDAS::PropertyInfo"); + if (pi) + { + PropertyDefinitionImpl& propdef = (PropertyDefinitionImpl&)pi->getPropertyDefinition(); + if (propdef.isSubstitute && propdef.substituteName.equals(prop.name)) + { + + LOGINFO_1(INFO,"XSDHelper adding substitute for property %s", (const char*)prop.name); + + dataFactory->setPropertySubstitute(typeUri,ty.name, + prop.name, propdef.name, + pl[j].getType().getURI(), + pl[j].getType().getName()); + prop.substituteNames.push_back(propdef.name); + prop.substituteLocalNames.push_back(propdef.localname); + } + } + } + } + catch (const SDORuntimeException&) + { + } + } + + + /** defineTypes + * + * This method works through all the data gathered during parsing + * and defines all the types using the data factory. + */ + + void XSDHelperImpl::defineTypes(TypeDefinitions& types) + { + defineTypes(types.getTypeDefinitions()); + } + + + /** defineTypes + * + * This method works through all the data gathered during parsing + * and defines all the types using the data factory. + */ + + void XSDHelperImpl::defineTypes(TypeDefinitionsImpl& typedefs) + { + DataFactoryImpl* df = (DataFactoryImpl*)(DataFactory*)dataFactory; + + XMLDAS_TypeDefs types = typedefs.types; + XMLDAS_TypeDefs::iterator iter; + + + for (iter=types.begin(); iter != types.end(); iter++) + { + TypeDefinitionImpl& ty = iter->second; + try + { + /* + string isSeqCode = "false"; + if (ty.isSequenced) + isSeqCode = "true"; + string isOpenCode = "false"; + if (ty.isOpen) + isOpenCode = "true"; + string isAbstractCode = "false"; + if (ty.isAbstract) + isAbstractCode = "true"; + string uriCode = "0"; + if (!ty.uri.isNull()) + { + uriCode = "\"" + string(ty.uri) + "\""; + } + + string addTypeCode = "dataFactory->addType(\n" + + uriCode + ", \"" + string(ty.name) + "\", \n" + + isSeqCode + ", " + isOpenCode + ", " + isAbstractCode +");"; + cout << addTypeCode.c_str() <<endl; + */ + + df->addType(ty.uri, ty.name, ty.isSequenced, + ty.isOpen, ty.isAbstract, ty.dataType, ty.isFromList); + df->setDASValue( + ty.uri, ty.name, + "XMLDAS::TypeInfo", + new XSDTypeInfo(ty)); + + // add aliases + if (!ty.aliases.isNull()) + { + SDOXMLString al = ty.aliases; + SDOXMLString al1 = ""; + int index; + while (!al.isNull() && !al.equals("")) + { + index = al.lastIndexOf(' '); + if (index < 0) + { + al1 = al; + al = ""; + } + else + { + al1 = al.substring(index + 1); + al = al.substring(0,index); + } + if (!al1.isNull() && !al1.equals("")) + { + df->setAlias( + ty.uri, + ty.name, + (const char*)al1); + } + } + } + + } + catch (SDORuntimeException& e) + { + SDO_RETHROW_EXCEPTION("defineTypes", e); + } + } + for (iter=types.begin(); iter != types.end(); iter++) + { + TypeDefinitionImpl& ty = iter->second; + if (!ty.parentTypeName.isNull()) + { + try + { + /* + string uriCode = "0"; + if (!ty.uri.isNull()) + { + uriCode = "\"" + string(ty.uri) + "\""; + } + string parentUriCode = "0"; + if (!ty.uri.isNull()) + { + parentUriCode = "\"" + string(ty.parentTypeUri) + "\""; + } + + string addTypeCode = "dataFactory->setBaseType(\n" + + uriCode + ", \"" + string(ty.name) + "\", \n" + + parentUriCode + ", \"" + string(ty.parentTypeName) + "\");"; + + cout << addTypeCode.c_str() <<endl; + */ + + df->setBaseType( + ty.uri, + ty.name, + ty.parentTypeUri, + ty.parentTypeName, + ty.isRestriction); + } + catch (SDORuntimeException& e) + { + SDO_RETHROW_EXCEPTION("defineTypes", e); + } + } + + XmlDasPropertyDefs::iterator propsIter; + for (propsIter = ty.properties.begin(); propsIter != ty.properties.end(); propsIter++) + { + PropertyDefinitionImpl& prop = *propsIter; + + // For a refence we need to determine the type from the + // global element declaration + if(prop.isReference) + { + + bool refFound = false; + + if (prop.name.isNull()) + prop.name = prop.typeName; + + + XMLDAS_TypeDefs::iterator refTypeIter = + types.find(TypeDefinitionsImpl::getTypeQName(prop.typeUri, "RootType")); + if(refTypeIter != types.end()) + { + + TypeDefinitionImpl rootTy = refTypeIter->second; + + // find the property on the root type + XmlDasPropertyDefs::iterator refPropsIter; + for (refPropsIter = rootTy.properties.begin(); refPropsIter != rootTy.properties.end(); refPropsIter++) + { + + if (refPropsIter->localname.equals(prop.typeName)) + { + prop.typeUri = refPropsIter->typeUri; + prop.typeName = refPropsIter->typeName; + refFound = true; + } + } + } + if (!refFound) + { + + // Check if this type is already defined to the data factory + try + { + const Type& rootType = dataFactory->getType(prop.typeUri, "RootType"); + PropertyList pl = rootType.getProperties(); + + for (int j = 0; j < pl.size(); j++) + { + + XSDPropertyInfo* pi = (XSDPropertyInfo*) + ((DASProperty*)&pl[j])->getDASValue("XMLDAS::PropertyInfo"); + + + + if (prop.typeName.equals(pl[j].getName()) + || (pi && prop.typeName.equals(pi->getPropertyDefinition().localname))) + { + prop.typeUri = pl[j].getType().getURI(); + prop.typeName = pl[j].getType().getName(); + refFound = true; + break; + } + } + } + catch (const SDORuntimeException&) + { + } + } + // If we haven't been able to resolve this reference we should ignore it + if (!refFound) + { + LOGINFO_1(INFO,"XsdHelper:no matching reference for %s", + (const char *)prop.name); + continue; + } + } + + if (prop.name.isNull()) + { + continue; + } + XMLDAS_TypeDefs::iterator propTypeIter = + types.find(TypeDefinitionsImpl::getTypeQName(prop.typeUri, prop.typeName)); + if(propTypeIter != types.end()) + { + prop.typeName = propTypeIter->second.name; + } + + try + { + + df->addPropertyToType(ty.uri, ty.name, + prop.name, + prop.typeUri, + prop.typeName, + prop.isMany, + prop.isReadOnly, + prop.isContainment); + + LOGINFO_1(INFO,"XSDHelper adds property %s",(const char*)(prop.name)); + + if (!prop.aliases.isNull()) + { + SDOXMLString al = prop.aliases; + SDOXMLString al1 = ""; + int index; + while (!al.isNull() && !al.equals("")) + { + index = al.lastIndexOf(' '); + if (index < 0) + { + al1 = al; + al = ""; + } + else + { + al1 = al.substring(index + 1); + al = al.substring(0,index); + } + if (!al1.isNull() && !al1.equals("")) + { + df->setAlias( + (const char*)ty.uri, + (const char*)ty.name, + (const char*)prop.name, + (const char*)al1); + } + } + } + if (prop.isSubstitute) + { + // we have a new substitute - so will check the existing graph for + // substitutions to insert + + LOGINFO_1(INFO,"XSDHelper: Found new substitute %s",(const char*)(prop.name)); + + newSubstitute( "RootType",prop); + } + else + { + addSubstitutes(prop,ty); + } + + // Do not add DASValue to ChangeSummary + if (!(prop.typeUri.equals(Type::SDOTypeNamespaceURI.c_str()) + && prop.typeName.equals("ChangeSummary"))) + { + df->setDASValue( + ty.uri, ty.name, + prop.name, + "XMLDAS::PropertyInfo", + new XSDPropertyInfo(prop)); + } + } + catch (SDORuntimeException& e) + { + SDO_RETHROW_EXCEPTION("defineTypes", e); + } + } + + } + } // End - defineTypes + + /** getDataFactory returns the factory + * + */ + + DataFactoryPtr XSDHelperImpl::getDataFactory() + { + return dataFactory; + } + + + /** generate buildsXSD from types/properties + * + * generate/generateFile + * + * Saves the types/properties to an XSD stream or file + * + */ + + void XSDHelperImpl::generateFile( + const TypeList& types, + const char* fileName, + const char* targetNamespaceURI, + int indent + ) + { + SDOXSDFileWriter writer(fileName); + DataFactory* fac = dataFactory; + writer.write(types, targetNamespaceURI, + ((DataFactoryImpl*)fac)->getOpenProperties(), indent); + } + + void XSDHelperImpl::generate( + const TypeList& types, + std::ostream& outXml, + const char* targetNamespaceURI, + int indent + ) + { + SDOXSDStreamWriter writer(outXml); + DataFactory* fac = dataFactory; + writer.write(types, targetNamespaceURI, + ((DataFactoryImpl*)fac)->getOpenProperties(), indent); + } + + char* XSDHelperImpl::generate( + const TypeList& types, + const char* targetNamespaceURI, + int indent + ) + { + SDOXSDBufferWriter writer; + DataFactory* fac = dataFactory; + writer.write(types, targetNamespaceURI, + ((DataFactoryImpl*)fac)->getOpenProperties(), indent); + SDOXMLString ret = writer.getBuffer(); + char* retString = new char[strlen(ret) +1]; + strcpy(retString, ret); + return retString; + } + + int XSDHelperImpl::getErrorCount() const + { + return parseErrors.size(); + } + + + const char* XSDHelperImpl::getErrorMessage(int errnum) const + { + if (errnum >= 0 && errnum < parseErrors.size()) + { + return parseErrors[errnum]; + } + return 0; + } + + void XSDHelperImpl::setError(const char* message) + { + if (message == 0) return; + char * m = new char[strlen(message) + 1]; + strcpy(m,message); + m[strlen(message)] = 0; + parseErrors.push_back(m); + } + + void XSDHelperImpl::clearErrors() + { + while (!parseErrors.empty()) + { + if (*parseErrors.begin() != 0) + { + delete (char*)(*parseErrors.begin()); + } + parseErrors.erase(parseErrors.begin()); + } + } + + + } // End - namespace sdo +} // End - namespace commonj diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelperImpl.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelperImpl.h new file mode 100644 index 0000000000..791d1229ce --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDHelperImpl.h @@ -0,0 +1,145 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2006/02/01 16:24:13 $ */ + +#ifndef _XSDHELPERIMPL_H_ +#define _XSDHELPERIMPL_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/XSDHelper.h" +#include "commonj/sdo/export.h" +#include "commonj/sdo/SDOXMLString.h" +#include "commonj/sdo/SAX2Namespaces.h" +#include "commonj/sdo/SchemaInfo.h" +#include "commonj/sdo/TypeDefinitionsImpl.h" +#include "commonj/sdo/ParserErrorSetter.h" + +namespace commonj +{ + namespace sdo + { + + /** + * + * XSDHelperImpl is the implementation of the abstract class + * XSDHelper. + * Provides the means of loading and saving XSD information + * from/to the metadata (Types and properties) + */ + + class XSDHelperImpl : public XSDHelper, ParserErrorSetter + { + public: + + // Constructor + XSDHelperImpl(DataFactoryPtr dataFactory); + + // Destructor + virtual ~XSDHelperImpl(); + + /** define builds types/properties from file or stream + * + * define/defineFile + * + * Populates the data factory with Types and Properties from the schema + * Loads from file, stream or char* buffer. + * The return value is the URI of the root Type + * + */ + virtual const char* defineFile(const char* schemaFile); + virtual const char* define(std::istream& schema); + virtual const char* define(const char* schema); + + /** getErrorCount gets number of parse errors + * + * Parser error count - the parse may have + * succeeded or partially succeeded or failed. There + * may be errors to report or handle. + */ + + virtual int getErrorCount() const; + + /** getErrorMessage gets the nth error message + * + * Each error has a message, usually giving the line and file + * in which the parser error occurred. + */ + + virtual const char* getErrorMessage(int errnum) const; + virtual void setError(const char* error); + + /** generate buildsXSD from types/properties + * + * generate/generateFile + * + * Saves the types/properties to an XSD stream or file + * + */ + + virtual char* generate( + const TypeList& types, + const char* targetNamespaceURI = "", + int indent = -1 + ); + void generate( + const TypeList& types, + std::ostream& outXsd, + const char* targetNamespaceURI = "", + int indent = -1 + ); + virtual void generateFile( + const TypeList& types, + const char* fileName, + const char* targetNamespaceURI = "", + int indent = -1); + + virtual DataFactoryPtr getDataFactory(); + + // Return the URI for the root Type + virtual const char* getRootTypeURI() + { + return schemaInfo.getTargetNamespaceURI(); + } + + virtual void defineTypes(TypeDefinitions& types); + + private: + virtual void clearErrors(); + + void newSubstitute(const char* entryName, + PropertyDefinitionImpl& prop); + + void addSubstitutes(PropertyDefinitionImpl& prop, + TypeDefinitionImpl& ty); + + void defineTypes(TypeDefinitionsImpl& types); + int parse(const char* source); + + // Instance variables + DataFactoryPtr dataFactory; // metadata + SchemaInfo schemaInfo; + + std::vector<char*> parseErrors; + + }; + + } // End - namespace sdo +} // End - namespace commonj + +#endif // _XSDHELPERIMPL_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDPropertyInfo.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDPropertyInfo.cpp new file mode 100644 index 0000000000..9d001232cb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDPropertyInfo.cpp @@ -0,0 +1,53 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XSDPropertyInfo.h" + +namespace commonj +{ + namespace sdo + { + + /** + * + * This holds a property definition during the parsing process + * when all properties need to be read and stored prior to creation + * within the data facttory. + */ + + XSDPropertyInfo::XSDPropertyInfo() + { + } + + XSDPropertyInfo::XSDPropertyInfo(const PropertyDefinitionImpl& prop) + : property(prop) + { + } + + + XSDPropertyInfo::~XSDPropertyInfo() + { + } + + + } +} +// end - namespace sdo + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDPropertyInfo.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDPropertyInfo.h new file mode 100644 index 0000000000..26307411a0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDPropertyInfo.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _XSDPropertyInfo_H_ +#define _XSDPropertyInfo_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/DASValue.h" +#include "commonj/sdo/PropertyDefinitionImpl.h" +#include "commonj/sdo/SDOXMLString.h" + +namespace commonj +{ + namespace sdo + { + + /** + * + * This holds a property definition during the parsing process. + * This holds a property definition during the parsing process + * when all properties need to be read and stored prior to creation + * within the data facttory. + */ + + class XSDPropertyInfo : public DASValue + { + public: + + XSDPropertyInfo(); + XSDPropertyInfo(const PropertyDefinitionImpl& prop); + + virtual ~XSDPropertyInfo(); + + const PropertyDefinitionImpl& getPropertyDefinition() {return property;} + + + private: + PropertyDefinitionImpl property; + }; + } +} +#endif //_XSDPropertyInfo_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDTypeInfo.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDTypeInfo.cpp new file mode 100644 index 0000000000..f0ae973195 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDTypeInfo.cpp @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XSDTypeInfo.h" + +namespace commonj +{ + namespace sdo + { + + /** XSDTypeInfo + * + * This holds a type definition during the parsing process + * when all types need to be read and stored prior to creation + * within the data facttory. + */ + + XSDTypeInfo::XSDTypeInfo() + { + } + + XSDTypeInfo::XSDTypeInfo(const TypeDefinitionImpl& typeDef) + : typeDefinition(typeDef) + { + } + + + XSDTypeInfo::~XSDTypeInfo() + { + + } + } +} +// end - namespace sdo + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDTypeInfo.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDTypeInfo.h new file mode 100644 index 0000000000..596766368c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XSDTypeInfo.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _XSDTypeInfo_H_ +#define _XSDTypeInfo_H_ + +#include "commonj/sdo/disable_warn.h" + +#include "commonj/sdo/DASValue.h" +#include "commonj/sdo/TypeDefinitionImpl.h" + +namespace commonj +{ + namespace sdo + { + /** + * + * This holds a type definition during the parsing process + * when all types need to be read and stored prior to creation + * within the data factory. + */ + + class XSDTypeInfo : public DASValue + { + public: + XSDTypeInfo(); + XSDTypeInfo(const TypeDefinitionImpl& typeDef); + virtual ~XSDTypeInfo(); + const TypeDefinitionImpl& getTypeDefinition() {return typeDefinition;} + + private: + TypeDefinitionImpl typeDefinition; + }; + } +} +#endif //_XSDTypeInfo_H_ diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XpathHelper.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XpathHelper.cpp new file mode 100644 index 0000000000..c53c577c2d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XpathHelper.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#include "commonj/sdo/XpathHelper.h" + +#include <string.h> + +namespace commonj{ +namespace sdo{ + +/** + * + * will provide utilities to help with xpath parsing + */ + +/** isIndexed - true if [] or . + * + * Returns true if the path has an index, indicating a many valued + * property at the end of the path. + */ + + +const bool XpathHelper::isIndexed(const char* path) +{ + const char * c = strrchr(path,'/'); + if (c == 0)c = path; + if (strchr(c,'[')) return true; + if (strchr(c,'.')) return true; + return false; +} + +}; +}; + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XpathHelper.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XpathHelper.h new file mode 100644 index 0000000000..862c89d307 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/XpathHelper.h @@ -0,0 +1,53 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef XPATH_HELPER_H +#define XPATH_HELPER_H + +#include "commonj/sdo/export.h" + +namespace commonj{ +namespace sdo{ + +/** + * + * XpathHelper provides utilities to help with xpath parsing + */ + +class XpathHelper +{ + public: + + virtual ~XpathHelper(); + + /** isIndexed - true if [] or . + * + * Returns true if the path has an index, indicating a many valued + * property at the end of the path. + */ + + static SDO_API const bool isIndexed(const char * path); + +}; +}; +}; + + +#endif + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/disable_warn.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/disable_warn.h new file mode 100644 index 0000000000..7743ab55de --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/disable_warn.h @@ -0,0 +1,27 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#ifndef _DISABLE_WARN_H_ +#define _DISABLE_WARN_H_ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#endif diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/export.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/export.h new file mode 100644 index 0000000000..51470a585b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/src/commonj/sdo/export.h @@ -0,0 +1,47 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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: 2005/12/22 16:54:15 $ */ + +#define SDO4CPP_VERSION 20051202 + +#if defined(WIN32) || defined (_WINDOWS) + +#define int64_t __int64 + +#ifdef SDO_EXPORTS +#include "commonj/sdo/disable_warn.h" +# define SDO_API __declspec(dllexport) +# define SDO_SPI __declspec(dllexport) +# define EXPIMP +#else +# define SDO_API __declspec(dllimport) +# define SDO_SPI __declspec(dllimport) +# define EXPIMP extern +#endif + +#else +#include <sys/time.h> +#include <inttypes.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> +# define SDO_API +# define SDO_SPI +# define EXPIMP +#endif + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.cdtbuild b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.cdtbuild new file mode 100644 index 0000000000..17ebd43324 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.cdtbuild @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?fileVersion 3.0.0?> + +<ManagedProjectBuildInfo> +<project id="tuscany_sdo_test.cdt.managedbuild.target.gnu.exe.841259234" name="Executable (Gnu)" projectType="cdt.managedbuild.target.gnu.exe"> +<configuration artifactName="tuscany_sdo_test" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="cdt.managedbuild.config.gnu.exe.debug.1698024418" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug"> +<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.953243590" name="GCC Tool Chain" superClass="cdt.managedbuild.toolchain.gnu.exe.debug"> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.907958268" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.829396762" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug"> +<option id="gnu.cpp.compiler.option.preprocessor.def.1484983546" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols"> +<listOptionValue builtIn="false" value="_DEBUG"/> +</option> +<option id="gnu.cpp.compiler.option.include.paths.1537573101" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value="${project_loc}"/> +<listOptionValue builtIn="false" value="${project_loc}/../src"/> +</option> +</tool> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.1017750405" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.655773583" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug"> +<option id="gnu.cpp.link.option.libs.684950781" superClass="gnu.cpp.link.option.libs" valueType="libs"> +<listOptionValue builtIn="false" value="tuscany_sdo"/> +<listOptionValue builtIn="false" value="xml2"/> +</option> +<option id="gnu.cpp.link.option.paths.507838253" superClass="gnu.cpp.link.option.paths" valueType="stringList"> +<listOptionValue builtIn="false" value="${project_loc}/../src/Debug"/> +<listOptionValue builtIn="false" value="${LIBXML2_LIB}"/> +</option> +</tool> +<tool command="as" id="cdt.managedbuild.tool.gnu.assembler.exe.debug.680127870" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug"/> +<macros/> +</toolChain> +</configuration> +<configuration artifactName="tuscany_sdo_test" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="cdt.managedbuild.config.gnu.exe.release.1720042110" name="Release" parent="cdt.managedbuild.config.gnu.exe.release"> +<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.1008721532" name="GCC Tool Chain" superClass="cdt.managedbuild.toolchain.gnu.exe.release"> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.1386443308" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.666703052" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release"> +<option id="gnu.cpp.compiler.option.include.paths.1488475926" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value="${project_loc}/../src"/> +<listOptionValue builtIn="false" value="${project_loc}"/> +</option> +</tool> +<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.linker.exe.release.87016949" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/> +<tool command="g++" id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.4247100" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release"> +<option id="gnu.cpp.link.option.libs.73989122" superClass="gnu.cpp.link.option.libs" valueType="libs"> +<listOptionValue builtIn="false" value="xml2"/> +<listOptionValue builtIn="false" value="tuscany_sdo"/> +</option> +<option id="gnu.cpp.link.option.paths.984022714" superClass="gnu.cpp.link.option.paths" valueType="stringList"> +<listOptionValue builtIn="false" value="${project_loc}/../src/Debug"/> +<listOptionValue builtIn="false" value="${LIBXML2_LIB}"/> +</option> +</tool> +<tool command="as" id="cdt.managedbuild.tool.gnu.assembler.exe.release.937369355" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release"/> +<macros/> +</toolChain> +</configuration> +<macros/> +</project> +</ManagedProjectBuildInfo> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.cdtproject b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.cdtproject new file mode 100644 index 0000000000..48a12e6664 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.cdtproject @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.managedbuilder.core.managedMake">
+<extension id="org.eclipse.cdt.managedbuilder.core.ManagedBuildManager" point="org.eclipse.cdt.core.ScannerInfoProvider"/>
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<extension id="org.eclipse.cdt.core.domsourceindexer" point="org.eclipse.cdt.core.CIndexer"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.managedbuilder.MANAGED_CONTAINER"/>
+</item>
+</data>
+</cdtproject>
diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.project b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.project new file mode 100644 index 0000000000..32920ef4cf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.project @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>tuscany_sdo_test</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.core.ccnature</nature> + </natures> +</projectDescription> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000000..0c77f0af0f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,9 @@ +#Wed Feb 15 16:37:24 GMT 2006 +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1698024418=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="CPATH" operation\="remove"/>\n<variable name\="CPLUS_INCLUDE_PATH" operation\="remove"/>\n</environment>\n +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1720042110=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="CPATH" operation\="remove"/>\n<variable name\="CPLUS_INCLUDE_PATH" operation\="remove"/>\n</environment>\n +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1698024418=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="LIBRARY_PATH" operation\="remove"/>\n</environment>\n +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1720042110=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable name\="LIBRARY_PATH" operation\="remove"/>\n</environment>\n +environment/project=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment/>\n +environment/project/cdt.managedbuild.config.gnu.exe.debug.1698024418=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable delimiter\="" name\="LIBXML2_LIB" operation\="replace" value\="/usr/lib"/>\n</environment>\n +environment/project/cdt.managedbuild.config.gnu.exe.release.1720042110=<?xml version\="1.0" encoding\="UTF-8"?>\n<environment>\n<variable delimiter\="" name\="LIBXML2_LIB" operation\="replace" value\="/usr/lib"/>\n</environment>\n diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog-out.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog-out.xsd new file mode 100644 index 0000000000..c56a4c341e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog-out.xsd @@ -0,0 +1,70 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns1="customerNS" xmlns:tns2="orderNS" xmlns:tns="catalogNS" targetNamespace="catalogNS"> +<xsd:element name="catalogType" type="CatalogType"/> +<xsd:complexType name="CatalogType"> +<xsd:sequence> +<xsd:element name="item" type="tns2:item" minOccurs="0" maxOccurs="unbounded"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="addressType" type="tns1:AddressType"/> +<xsd:complexType name="tns1:AddressType"> +<xsd:sequence> +<xsd:element name="street" type="xsd:String" minOccurs="0"/> +<xsd:element name="city" type="xsd:String" minOccurs="0"/> +<xsd:element name="state" type="xsd:String" minOccurs="0"/> +<xsd:element name="zip" type="xsd:String" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="customerType" type="tns1:CustomerType"/> +<xsd:complexType name="tns1:CustomerType"> +<xsd:sequence> +<xsd:element name="customerId" type="xsd:String" minOccurs="0"/> +<xsd:element name="name" type="xsd:String" minOccurs="0"/> +<xsd:element name="shipping" type="tns1:AddressType" minOccurs="0"/> +<xsd:element name="payment" type="tns1:PaymentType" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="paymentType" type="tns1:PaymentType"/> +<xsd:complexType name="tns1:PaymentType"> +<xsd:sequence> +<xsd:element name="accountNo" type="xsd:String" minOccurs="0"/> +<xsd:element name="bank" type="xsd:String" minOccurs="0"/> +<xsd:element name="securityCode" type="xsd:String" minOccurs="0"/> +<xsd:element name="amount" type="xsd:float" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="rootType" type="tns1:RootType"/> +<xsd:complexType name="tns1:RootType"> +<xsd:sequence> +<xsd:element name="customer" type="tns1:CustomerType" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:simpleType name="tns2:OrderStatus"> +<xsd:restriction base="xsd:String"/> +</xsd:simpleType> +<xsd:element name="orderType" type="tns2:OrderType"/> +<xsd:complexType name="tns2:OrderType"> +<xsd:sequence> +<xsd:element name="orderId" type="xsd:String" minOccurs="0"/> +<xsd:element name="status" type="tns2:OrderStatus" minOccurs="0"/> +<xsd:element name="item" type="tns2:item" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="customer" type="tns1:CustomerType" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="rootType" type="tns2:RootType"/> +<xsd:complexType name="tns2:RootType"> +<xsd:sequence> +<xsd:element name="order" type="tns2:OrderType" minOccurs="0"/> +<xsd:element name="item" type="tns2:item" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="item" type="tns2:item"/> +<xsd:complexType name="tns2:item"> +<xsd:sequence> +<xsd:element name="itemId" type="xsd:integer" minOccurs="0"/> +<xsd:element name="description" type="xsd:String" minOccurs="0"/> +<xsd:element name="price" type="xsd:String" minOccurs="0"/> +<xsd:element name="quantity" type="xsd:integer" minOccurs="0"/> +<xsd:element name="warehouseId" type="xsd:integer" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog.xml new file mode 100644 index 0000000000..809aced5a0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<catalog xmlns="catalogNS" xsi:type="CatalogType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><item xmlns="orderNS"><itemId>1</itemId><description>A Partridge in a Pear Tree</description><price>1.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>2</itemId><description>Turtle Doves</description><price>2.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>3</itemId><description>French Hens</description><price>3.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>4</itemId><description>Calling Birds</description><price>4.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>5</itemId><description>Golden Rings</description><price>5.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>6</itemId><description>Geese a-laying</description><price>6.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>7</itemId><description>Swans a-swimming</description><price>7.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>8</itemId><description>Maids a-milking</description><price>8.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>9</itemId><description>Ladies dancing</description><price>9.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>10</itemId><description>Lords a-leaping</description><price>10.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>11</itemId><description>Pipers piping</description><price>11.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item><item><itemId>12</itemId><description>Drummers drumming</description><price>12.99</price><quantity>0</quantity><warehouseId>1</warehouseId></item></catalog> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog.xsd new file mode 100644 index 0000000000..28fd9d2f31 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Catalog.xsd @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:cat="catalogNS" xmlns:ord="orderNS" targetNamespace="catalogNS"> + + <include schemaLocation="Order.xsd"/> + + <element name="catalog" type="cat:CatalogType"/> + + <complexType name="CatalogType"> + <sequence> + <element maxOccurs="unbounded" ref="ord:item"/> + </sequence> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Customer.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Customer.xsd new file mode 100644 index 0000000000..8471db253b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Customer.xsd @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:cust="customerNS" targetNamespace="customerNS"> + <element name="customer" type="cust:CustomerType"> + <complexType name="CustomerType"> + <sequence> + <element name="customerId" type="ID"/> + <element name="name" type="string"/> + <element name="shipping" type="cust:AddressType"> + <complexType name="AddressType"> + <element name="street" type="string"/> + <element name="city" type="string"/> + <element name="state" type="string"/> + <element name="zip" type="string"/> + </complexType> + </element> + <element name="payment" ref="cust:payment"/> + </sequence> + </complexType> + </element> + + <element name="payment" type="cust:PaymentType"> + <complexType name="PaymentType"> + <element name="paymentId" type="ID"/> + <element name="accountNo" type="string"/> + <element name="bank" type="string"/> + <element name="securityCode" type="string"/> + <element name="amount" type="string"/> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Order.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Order.xsd new file mode 100644 index 0000000000..00036ae870 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/47293Order.xsd @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:ord="orderNS" xmlns:cust="customerNS" targetNamespace="orderNS"> + + <include schemaLocation="./Customer.xsd"/> + + <element name="orders" type="ord:OrdersType"> + <complexType name="OrdersType"> + <sequence> + <element name="order" maxOccurs="unbounded" type="ord:OrderType"/> + </sequence> + </complexType> + </element> + + <element name="order" type="ord:OrderType"> + <complexType name="OrderType"> + <sequence> + <element name="orderId" type="ID"/> + <element name="status" type="ord:OrderStatus"/> + <element name="item" maxOccurs="unbounded" ref="ord:item"/> + <element ref="cust:customer"/> + </sequence> + </complexType> + </element> + + <element name="item"> + <complexType> + <element name="itemId" type="integer"/> + <element name="description" type="string"/> + <element name="price" type="string"/> + <element name="quantity" type="integer"/> + <element name="warehouseId" type="integer"/> + </complexType> + </element> + + <simpleType name="OrderStatus"> + <restriction base="string"> + <enumeration value="NONE"/> + <enumeration value="RECEIVED"/> + <enumeration value="INVOICED"/> + <enumeration value="DISPATCHED"/> + <enumeration value="COMPLETED"/> + <enumeration value="CANCELLED"/> + </restriction> + </simpleType> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48601.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48601.xsd new file mode 100644 index 0000000000..a5ef35ed7c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48601.xsd @@ -0,0 +1,42 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +<xs:complexType name="product"> + <xs:sequence> + <xs:element name="brand" type="xs:string"/> + <xs:element name="size" type="available_sizes"/> + </xs:sequence> +</xs:complexType> + +<xs:simpleType name='available_sizes'> + <xs:union> + <xs:simpleType> + <xs:restriction base='nonNegativeInteger'/> + </xs:simpleType> + <xs:simpleType> + <xs:restriction base='string'> + <xs:enumeration value='large'/> + <xs:enumeration value='small'/> + </xs:restriction> + </xs:simpleType> + </xs:union> +</xs:simpleType> + +</xs:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48686.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48686.xml new file mode 100644 index 0000000000..19e3ea93fe --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48686.xml @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<name + xmlns="http://www.wrox.com/name" + xmlns:xsi="http://www.w3.org/2001/XMLSchem-Instance" + xsi:schemaLocation="http://www.wrox.com/name name.xsd"> + <first>John</first> + <middle>Fitzgerald</middle> + <last>Doe</last> + <ages>1 2 3</ages> +</name> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48686.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48686.xsd new file mode 100644 index 0000000000..c06650bba6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48686.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.wrox.com/name" + xmlns:tns="http://www.wrox.com/name"> + + <element name="name"> + <complexType> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + <element name="ages"> + <simpleType> + <list itemType="positiveInteger"/> + </simpleType> + </element> + </sequence> + </complexType> + </element> + + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736.xml new file mode 100644 index 0000000000..9fe7208345 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736.xml @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<formalname + xmlns="TNS" + xmlns:xsi="http://www.w3.org/2001/XMLSchem-Instance" + xsi:schemaLocation="http://www.wrox.com/name name.xsd" + title="Mr."> + <last>Doe</last> +</formalname> + + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736.xsd new file mode 100644 index 0000000000..1d531f9d11 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736.xsd @@ -0,0 +1,46 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="TNS" + xmlns:tns="TNS"> + + <complexType name="FormalNameType"> + <complexContent> + <restriction base="tns:NameType"> + <sequence> + <element ref="tns:last"/> + </sequence> + </restriction> + </complexContent> + </complexType> + + + <complexType name="NameType"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + <attribute name="title" type="string"/> + </complexType> + + <element name="formalname" type="tns:FormalNameType"/> + <element name="last" type="string"/> + +</schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736_xml.txt new file mode 100644 index 0000000000..d7b9d4b8d4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736_xml.txt @@ -0,0 +1,42 @@ +***** TYPES AFTER RESOLVE********************************* +Type:TNS#FormalNameType +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +Type:TNS#NameType +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +Type:TNS#RootType +Property:formalname of type FormalNameType +Property:last of type String +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +*******************************END TYPES****************** +===== DataObject contents ===== +first:string: + +middle:string: + +last:string:Doe + +title:string:Mr. + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736_xsd.txt new file mode 100644 index 0000000000..822a05ec7f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/48736_xsd.txt @@ -0,0 +1,29 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:TNS#FormalNameType +Property:last of type String +Type:TNS#NameType +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +Type:TNS#RootType +Property:formalname of type FormalNameType +Property:last of type String +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Atom1.0.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Atom1.0.xsd new file mode 100644 index 0000000000..67942de547 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Atom1.0.xsd @@ -0,0 +1,202 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema targetNamespace="http://www.w3.org/2005/Atom" + xmlns="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" /> + <xs:import namespace="http://www.w3.org/1999/xhtml" schemaLocation="xhtml1.xsd" /> + + <xs:element name="feed" type="feedType"/> + <xs:element name="entry" type="entryType"/> + + <xs:complexType name="feedType"> + <xs:complexContent> + <xs:extension base="sourceType"> + <xs:sequence> + <xs:element name="entry" type="entryType" minOccurs="0" maxOccurs="unbounded" /> + </xs:sequence> + <xs:attributeGroup ref="commonAttributes" /> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="entryType"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="author" type="personConstruct" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="category" type="categoryType" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="content" type="contentType" minOccurs="0" /> + <xs:element name="contributor" type="personConstruct" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="id" type="idType" /> + <xs:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="published" type="dateConstruct" minOccurs="0" /> + <xs:element name="rights" type="textConstruct" minOccurs="0" /> + <xs:element name="source" type="sourceType" minOccurs="0" /> + <xs:element name="summary" type="textConstruct" maxOccurs="0" /> + <xs:element name="title" type="textConstruct" /> + <xs:element name="updated" type="dateConstruct" /> + <xs:element name="extension" type="extensionType" minOccurs="0" maxOccurs="unbounded" /> + </xs:choice> + <xs:attributeGroup ref="commonAttributes"/> + </xs:complexType> + + <xs:complexType name="sourceType"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="author" type="personConstruct" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="category" type="categoryType" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="contributor" type="personConstruct" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="generator" type="generatorType" minOccurs="0" /> + <xs:element name="icon" type="iconType" minOccurs="0" /> + <xs:element name="id" type="idType" /> + <xs:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="logo" type="logoType" minOccurs="0" /> + <xs:element name="rights" type="textConstruct" minOccurs="0" /> + <xs:element name="subtitle" type="textConstruct" minOccurs="0" /> + <xs:element name="title" type="textConstruct" /> + <xs:element name="updated" type="dateConstruct" /> + <xs:element name="extension" type="extensionType" minOccurs="0" maxOccurs="unbounded" /> + </xs:choice> + </xs:complexType> + + <xs:complexType name="personConstruct"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="name" type="xs:string" /> + <xs:element name="uri" type="uriType" minOccurs="0" /> + <xs:element name="email" type="emailType" minOccurs="0" /> + <xs:element name="extension" type="extensionType" minOccurs="0" maxOccurs="unbounded" /> + </xs:choice> + </xs:complexType> + + <xs:complexType name="categoryType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="term" type="xs:string" use="required" /> + <xs:attribute name="scheme" type="uriType" /> + <xs:attribute name="label" type="xs:string" /> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + <!-- TODO: undefinedContent - beyond string? --> + </xs:complexType> + + <xs:complexType name="generatorType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="uri" type="uriType" /> + <xs:attribute name="version" type="xs:string" /> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:complexType name="iconType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:complexType name="idType"> + <xs:simpleContent> + <xs:extension base="uriType"> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:complexType name="logoType"> + <xs:simpleContent> + <xs:extension base="uriType"> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:complexType name="contentType" mixed="true"> + <xs:sequence> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </xs:sequence> + <xs:attribute name="type" type="xs:string" /> + <xs:attribute name="src" type="uriType" minOccurs="0" /> + <xs:attributeGroup ref="commonAttributes"/> + </xs:complexType> + + <xs:complexType name="linkType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="href" type="uriType" use="required" /> + <xs:attribute name="rel" type="uriType" /> <!-- { atomNCName | atomUri }? --> + <xs:attribute name="type" type="mediaType" /> + <xs:attribute name="hreflang" type="languageTagType" /> + <xs:attribute name="title" type="xs:string" /> + <xs:attribute name="length" type="xs:string" /> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:simpleType name="languageTagType"> + <xs:restriction base="xs:string"> + <xs:pattern value="[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*" /> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="mediaType"> + <xs:restriction base="xs:string"> + <xs:pattern value=".+/.+" /> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="emailType"> + <xs:restriction base="xs:string"> + <xs:pattern value=".+@.+" /> + </xs:restriction> + </xs:simpleType> + + <xs:complexType name="textConstruct" mixed="true"> + <xs:sequence> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </xs:sequence> + <xs:attribute name="type" type="xs:string" /> + <xs:attributeGroup ref="commonAttributes"/> + </xs:complexType> + + <xs:complexType name="dateConstruct"> + <xs:simpleContent> + <xs:extension base="xs:dateTime"> + <xs:attributeGroup ref="commonAttributes"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:simpleType name="uriType" type="xs:string" /> + + <xs:complexType name="extensionType" mixed="true"> + <xs:sequence> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </xs:sequence> + <xs:anyAttribute /> + </xs:complexType> + + <xs:attributeGroup name="commonAttributes"> + <xs:attribute ref="xml:base" /> + <xs:attribute ref="xml:lang" /> + <xs:anyAttribute/> + </xs:attributeGroup> + +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/BadElement.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/BadElement.xml new file mode 100644 index 0000000000..981287237a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/BadElement.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<Holiday xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="TravelBookingSchema.xsd"> + <Flight flightNo="BA243"> + <Departure>NCE</Departure> + <Arrival>PAR</Arrival> + <ThisJustAintPartOfTheSchema>DATA</ThisJustAintPartOfTheSchema> + </Flight> +</Holiday> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/BadElement.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/BadElement.xsd new file mode 100644 index 0000000000..84af953576 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/BadElement.xsd @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="Holiday"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Flight" maxOccurs="unbounded" minOccurs="1"/> + <xsd:element ref="Hotel" maxOccurs="unbounded" minOccurs="1"/> + <xsd:element ref="Excursion"/> + <xsd:element ref="Client"/> + <xsd:element ref="Party"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Flight"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Departure" type="xsd:string"/> + <xsd:element name="Arrival" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="flightNo" type="xsd:string" use="required"/> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Hotel"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + <xsd:element name="Phone" type="xsd:string"/> + <xsd:element ref="Room"/> + </xsd:sequence> + <xsd:attribute name="cardsAccepted" default="false" type="xsd:boolean"/> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Room"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="booked" use="required" type="xsd:boolean"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Party"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Person" maxOccurs="unbounded" minOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Person"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Client"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + <xsd:element name="Address" type="xsd:string"/> + <xsd:element name="CreditCard" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Excursion"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Title" type="xsd:string"/> + <xsd:element name="Cost" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Name" type="xsd:string"/> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Catalog.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Catalog.xsd new file mode 100644 index 0000000000..23f3363394 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Catalog.xsd @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:cat="catalogNS" targetNamespace="catalogNS"> + + <include schemaLocation="./Order.xsd"/> + + <element name="catalog" type="cat:CatalogType"/> + + <complexType name="CatalogType"> + <sequence> + <element maxOccurs="unbounded" ref="ord:item"/> + </sequence> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Customer.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Customer.xsd new file mode 100644 index 0000000000..670a804109 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Customer.xsd @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:cust="customerNS" targetNamespace="customerNS"> + <element name="customer" type="cust:CustomerType"> + <complexType name="CustomerType"> + <sequence> + <element name="customerId" type="ID"/> + <element name="name" type="string"/> + <element name="shipping" type="cust:AddressType"> + <complexType name="AddressType"> + <element name="street" type="string"/> + <element name="city" type="string"/> + <element name="state" type="string"/> + <element name="zip" type="string"/> + </complexType> + </element> + <element name="payment" type="cust:PaymentType"> + <complexType name="PaymentType"> + <element name="accountNo" type="string"/> + <element name="bank" type="string"/> + <element name="securityCode" type="string"/> + <element name="amount" type="float"/> + </complexType> + </element> + </sequence> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Makefile.am b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Makefile.am new file mode 100644 index 0000000000..09c11205d7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Makefile.am @@ -0,0 +1,16 @@ +prgbindir=$(prefix)/bin/test +prgbin_PROGRAMS = tuscany_sdo_test +SUBDIRS = +AM_CPPFLAGS = $(CPPFLAGS) +tuscany_sdo_test_SOURCES = sdotest.cpp sdotest2.cpp utils.cpp main.cpp + +EXTRA_DIST = *.xsd *.xml *.txt *.wsdl test/*.* test2/*.* t2/*.* g/*.* bugs/1/*.* +noinst_HEADERS=sdotest.h + +tuscany_sdo_test_LDADD = \ + -L$(top_builddir)/runtime/core/src/commonj/sdo -ltuscany_sdo \ + -L${LIBXML2_LIB} -lxml2 + + +INCLUDES = -I$(top_builddir)/runtime/core/test \ + -I$(top_builddir)/runtime/core/src diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/OddChars.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/OddChars.xml new file mode 100644 index 0000000000..920ef3c8bb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/OddChars.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<Holiday xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="TravelBookingSchema.xsd"> + <Flight flightNo="BA243"> + <Departure>ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╔╩╦╠═╬¤ðÐÊËÈıÍÎÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ </Departure> + <Arrival>Pound:£ Dollar:$ Euro:Ç or █</Arrival> + </Flight> +</Holiday> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/OddChars.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/OddChars.xsd new file mode 100644 index 0000000000..84af953576 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/OddChars.xsd @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="Holiday"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Flight" maxOccurs="unbounded" minOccurs="1"/> + <xsd:element ref="Hotel" maxOccurs="unbounded" minOccurs="1"/> + <xsd:element ref="Excursion"/> + <xsd:element ref="Client"/> + <xsd:element ref="Party"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Flight"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Departure" type="xsd:string"/> + <xsd:element name="Arrival" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="flightNo" type="xsd:string" use="required"/> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Hotel"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + <xsd:element name="Phone" type="xsd:string"/> + <xsd:element ref="Room"/> + </xsd:sequence> + <xsd:attribute name="cardsAccepted" default="false" type="xsd:boolean"/> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Room"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="booked" use="required" type="xsd:boolean"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Party"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Person" maxOccurs="unbounded" minOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Person"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Client"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + <xsd:element name="Address" type="xsd:string"/> + <xsd:element name="CreditCard" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Excursion"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Title" type="xsd:string"/> + <xsd:element name="Cost" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Name" type="xsd:string"/> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Order.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Order.xsd new file mode 100644 index 0000000000..4dbbad9507 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Order.xsd @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:ord="orderNS" xmlns:cust="customerNS" targetNamespace="orderNS"> + +<include schemaLocation="./Customer.xsd"/> + +<element name="order" type="ord:OrderType"> + <complexType name="OrderType"> + <sequence> + <element name="orderId" type="ID"/> + <element name="status" type="ord:OrderStatus"/> + <element name="item" maxOccurs="unbounded" ref="ord:item"/> + <element ref="cust:customer"/> + </sequence> + </complexType> + </element> + + <element name="item"> + <complexType> + <element name="itemId" type="integer"/> + <element name="description" type="string"/> + <element name="price" type="string"/> + <element name="quantity" type="integer"/> + <element name="warehouseId" type="integer"/> + </complexType> + </element> + + <simpleType name="OrderStatus"> + <restriction base="string"> + <enumeration value="NONE"/> + <enumeration value="RECEIVED"/> + <enumeration value="INVOICED"/> + <enumeration value="DISPATCHED"/> + <enumeration value="COMPLETED"/> + <enumeration value="CANCELLED"/> + </restriction> + </simpleType> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/SdoGenerate.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/SdoGenerate.cpp new file mode 100644 index 0000000000..375f72d3d8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/SdoGenerate.cpp @@ -0,0 +1,166 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: SdoGenerate.cpp,v 1.2 2006/03/16 12:53:57 slattery Exp $ */ + +/* work in progress on generation of structures from sdos*/ + +#include <stdio.h> + +#pragma warning(disable:4786) + +#include <iostream> +using namespace std; + + + +#include "sdotest.h" + + + +using namespace commonj::sdo; + + +char* sdotest::convert(const char* uri) +{ + char* newval = (char*)malloc(strlen(uri) + 1); + strcpy(newval,uri); + + char* c; + while ((c = strchr(newval,'.')) != 0) + { + char * tmp = (char*)malloc(strlen(newval) + 5); + strncpy(tmp,newval, c - newval); + tmp[c-newval] = 0; + strcat(tmp,"<dot>"); + strcat(tmp,c+1); + free(newval); + newval = tmp; + } + return newval; +} + + +void sdotest::generate(DataFactoryPtr fac) +{ + try { + + TypeList tl = fac->getTypes(); + + + cout << "// Generated structures " << endl; + + for (int i=0;i<tl.size();i++) + { + + if (!strcmp(tl[i].getURI(),"commonj.sdo")) continue; + + char *uri = convert(tl[i].getURI()); + + cout << "typedef struct _"; + if (uri) cout << uri << "_"; + cout << tl[i].getName(); + + cout << "{" << endl; + + + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + if (pl[j].isMany()) + { + cout << "struct _"; + char *v = convert(pl[j].getType().getURI()); + if (v) cout << v << "_"; + cout << pl[j].getType().getName(); + cout << "List *" << pl[j].getName() << ";" << endl; + if (v) free(v); + } + else + { + if (pl[j].getType().isDataType()) + { + switch (pl[j].getTypeEnum()) + { + case Type::BooleanType: + + cout << "bool " << pl[j].getName() << ";" << endl; + break; + case Type::ByteType: + cout << "char " << pl[j].getName() << ";" << endl; + break; + case Type::BytesType: + cout << "char* " << pl[j].getName() << ";" << endl; + break; + case Type::CharacterType: + cout << "wchar " << pl[j].getName() << ";" << endl; + break; + case Type::DateType: + cout << "time_t " << pl[j].getName() << ";" << endl; + break; + case Type::DoubleType: + cout << "long double " << pl[j].getName() << ";" << endl; + break; + case Type::FloatType: + cout << "float " << pl[j].getName() << ";" << endl; + break; + case Type::IntegerType: + cout << "long " << pl[j].getName() << ";" << endl; + break; + case Type::LongType: + cout << "int64_t " << pl[j].getName() << ";" << endl; + break; + case Type::ShortType: + cout << "short " << pl[j].getName() << ";" << endl; + break; + case Type::StringType: + case Type::UriType: + cout << "wchar_t* " << pl[j].getName() << ";" << endl; + break; + default: + cout << "// unknown primitive: " << pl[j].getName() << endl; + break; + } + } + else + { + cout << "struct _"; + char *v = convert(pl[j].getType().getURI()); + if (v) cout << v << "_"; + cout << pl[j].getType().getName(); + cout << " *" << pl[j].getName() << ";" << endl; + if (v) free(v); + } + } + } + + cout << "} "; + if (uri) cout << uri << "_"; + cout << tl[i].getName() << ";" << endl; + if (uri) free(uri); + + } + + cout << "// generated Accessors" << endl; + } + catch (SDORuntimeException e) + { + cout << "Exception in Generation" << endl; + cout << e << endl; + } +} + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/StockQuoteService.wsdl b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/StockQuoteService.wsdl new file mode 100644 index 0000000000..4917cde583 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/StockQuoteService.wsdl @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="utf-8" ?>
+<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:s="http://www.w3.org/2001/XMLSchema"
+ xmlns:s0="http://swanandmokashi.com"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
+ xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
+ targetNamespace="http://swanandmokashi.com"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <s:schema elementFormDefault="qualified"
+ targetNamespace="http://swanandmokashi.com"
+ xmlns:s="http://www.w3.org/2001/XMLSchema">
+ <s:element name="GetQuotes">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1"
+ name="QuoteTicker" type="s:string" />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetQuotesResponse">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1"
+ name="GetQuotesResult" type="s0:ArrayOfQuote" />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:complexType name="ArrayOfQuote">
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="unbounded"
+ name="Quote" type="s0:Quote" />
+ </s:sequence>
+ </s:complexType>
+ <s:complexType name="Quote">
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1"
+ name="CompanyName" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="StockTicker" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="StockQuote" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="LastUpdated" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1" name="Change"
+ type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="OpenPrice" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="DayHighPrice" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="DayLowPrice" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1" name="Volume"
+ type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="MarketCap" type="s:string" />
+ <s:element minOccurs="0" maxOccurs="1"
+ name="YearRange" type="s:string" />
+ </s:sequence>
+ </s:complexType>
+ <s:element name="ArrayOfQuote" nillable="true"
+ type="s0:ArrayOfQuote" />
+ </s:schema>
+ </types>
+ <message name="GetQuotesSoapIn">
+ <part name="parameters" element="s0:GetQuotes" />
+ </message>
+ <message name="GetQuotesSoapOut">
+ <part name="parameters" element="s0:GetQuotesResponse" />
+ </message>
+ <message name="GetQuotesHttpGetIn">
+ <part name="QuoteTicker" type="s:string" />
+ </message>
+ <message name="GetQuotesHttpGetOut">
+ <part name="Body" element="s0:ArrayOfQuote" />
+ </message>
+ <message name="GetQuotesHttpPostIn">
+ <part name="QuoteTicker" type="s:string" />
+ </message>
+ <message name="GetQuotesHttpPostOut">
+ <part name="Body" element="s0:ArrayOfQuote" />
+ </message>
+ <portType name="StockQuotesSoap">
+ <operation name="GetStockQuotes">
+ <input name="GetQuotes" message="s0:GetQuotesSoapIn" />
+ <output name="GetQuotes" message="s0:GetQuotesSoapOut" />
+ </operation>
+ </portType>
+ <portType name="StockQuotesHttpGet">
+ <operation name="GetStockQuotes">
+ <input name="GetQuotes" message="s0:GetQuotesHttpGetIn" />
+ <output name="GetQuotes" message="s0:GetQuotesHttpGetOut" />
+ </operation>
+ </portType>
+ <portType name="StockQuotesHttpPost">
+ <operation name="GetStockQuotes">
+ <input name="GetQuotes" message="s0:GetQuotesHttpPostIn" />
+ <output name="GetQuotes" message="s0:GetQuotesHttpPostOut" />
+ </operation>
+ </portType>
+ <binding name="StockQuotesSoap" type="s0:StockQuotesSoap">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
+ style="document" />
+ <operation name="GetStockQuotes">
+ <soap:operation
+ soapAction="http://swanandmokashi.com/GetQuotes" style="document" />
+ <input name="GetQuotes">
+ <soap:body use="literal" />
+ </input>
+ <output name="GetQuotes">
+ <soap:body use="literal" />
+ </output>
+ </operation>
+ </binding>
+ <binding name="StockQuotesHttpGet" type="s0:StockQuotesHttpGet">
+ <http:binding verb="GET" />
+ <operation name="GetStockQuotes">
+ <http:operation location="/GetQuotes" />
+ <input name="GetQuotes">
+ <http:urlEncoded />
+ </input>
+ <output name="GetQuotes">
+ <mime:mimeXml part="Body" />
+ </output>
+ </operation>
+ </binding>
+ <binding name="StockQuotesHttpPost" type="s0:StockQuotesHttpPost">
+ <http:binding verb="POST" />
+ <operation name="GetStockQuotes">
+ <http:operation location="/GetQuotes" />
+ <input name="GetQuotes">
+ <mime:content type="application/x-www-form-urlencoded" />
+ </input>
+ <output name="GetQuotes">
+ <mime:mimeXml part="Body" />
+ </output>
+ </operation>
+ </binding>
+ <service name="StockQuotes">
+ <port name="StockQuotesSoap" binding="s0:StockQuotesSoap">
+ <soap:address
+ location="http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx" />
+ </port>
+ <port name="StockQuotesHttpGet"
+ binding="s0:StockQuotesHttpGet">
+ <http:address
+ location="http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx" />
+ </port>
+ <port name="StockQuotesHttpPost"
+ binding="s0:StockQuotesHttpPost">
+ <http:address
+ location="http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx" />
+ </port>
+ </service>
+</definitions>
diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style1.xsd new file mode 100644 index 0000000000..8ff9357ef9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style1.xsd @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:lib="libraryNS" targetNamespace="libraryNS"> + + <element name="character"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="author"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="isbn"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="title"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="available"> + <complexType> + <element name="isInPrint" type="boolean"/> + </complexType> + </element> + +<element name="library"> + <complexType > + <sequence> + <element name="book" maxOccurs="unbounded"> + <complexType> + <sequence> + <element ref="isbn"/> + <element ref="title"/> + <element ref="author" minOccurs="0" maxOccurs="unbounded"/> + <element ref="character" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute ref="id"/> + <attribute ref="available"/> + </complexType> + </element> + </sequence> + </complexType> + </element> + </schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style2.xsd new file mode 100644 index 0000000000..651a098956 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style2.xsd @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:lib="libraryNS" targetNamespace="libraryNS"> + + <element name="character"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="author"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="isbn"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="title"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="available"> + <complexType> + <element name="isInPrint" type="boolean"/> + </complexType> + </element> + +<element name="book"> + <complexType> + <sequence> + <element ref="isbn"/> + <element ref="title"/> + <element ref="author" minOccurs="0" maxOccurs="unbounded"/> + <element ref="character" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute ref="id"/> + <attribute ref="available"/> + </complexType> +</element> + + <element name="library"> + <complexType > + <sequence> + <element name="book" maxOccurs="unbounded"/> + </sequence> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style3.xsd new file mode 100644 index 0000000000..af224db483 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style3.xsd @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:lib="libraryNS" targetNamespace="libraryNS"> + + + <element name="character"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="author"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="isbn"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="title"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="available"> + <complexType> + <element name="isInPrint" type="boolean"/> + </complexType> + </element> + + <complexType name="bookType" > + <sequence> + <element ref="isbn"/> + <element ref="title"/> + <element ref="author" minOccurs="0" maxOccurs="unbounded"/> + <element ref="character" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute ref="id"/> + <attribute ref="available"/> + </complexType> + + + <element name="library"> + <complexType > + <sequence> + <element name="book" type="lib:bookType" maxOccurs="unbounded"/> + </sequence> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style4.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style4.xsd new file mode 100644 index 0000000000..8ff8547f50 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/Style4.xsd @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:lib="libraryNS" targetNamespace="libraryNS"> + + <group name="bookGroup"> + <sequence> + <element name="book"> + <complexType > + <sequence> + <element ref="isbn"/> + <element ref="title"/> + <element ref="author" minOccurs="0" maxOccurs="unbounded"/> + <element ref="character" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute ref="id"/> + <attribute ref="available"/> + </complexType> + </element> + </sequence> + </group> + + + <element name="character"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="author"> + <complexType> + <element name="name" type="string"/> + </complexType> + </element> + + <element name="isbn"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="title"> + <complexType> + <element name="value" type="string"/> + </complexType> + </element> + + <element name="available"> + <complexType> + <element name="isInPrint" type="boolean"/> + </complexType> + </element> + + <element name="library"> + <complexType > + <sequence> + <group ref="lib:bookGroup" maxOccurs="unbounded"/> + </sequence> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/TravelBookingSchema.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/TravelBookingSchema.xsd new file mode 100644 index 0000000000..84af953576 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/TravelBookingSchema.xsd @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="Holiday"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Flight" maxOccurs="unbounded" minOccurs="1"/> + <xsd:element ref="Hotel" maxOccurs="unbounded" minOccurs="1"/> + <xsd:element ref="Excursion"/> + <xsd:element ref="Client"/> + <xsd:element ref="Party"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Flight"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Departure" type="xsd:string"/> + <xsd:element name="Arrival" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="flightNo" type="xsd:string" use="required"/> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Hotel"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + <xsd:element name="Phone" type="xsd:string"/> + <xsd:element ref="Room"/> + </xsd:sequence> + <xsd:attribute name="cardsAccepted" default="false" type="xsd:boolean"/> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Room"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="booked" use="required" type="xsd:boolean"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Party"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Person" maxOccurs="unbounded" minOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Person"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Client"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="Name"/> + <xsd:element name="Address" type="xsd:string"/> + <xsd:element name="CreditCard" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Excursion"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Title" type="xsd:string"/> + <xsd:element name="Cost" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="Name" type="xsd:string"/> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/TravelBookingUsingSchema.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/TravelBookingUsingSchema.xml new file mode 100644 index 0000000000..80bcad875b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/TravelBookingUsingSchema.xml @@ -0,0 +1,63 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<Holiday xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="TravelBookingSchema.xsd"> + <Flight flightNo="BA243"> + <Departure>LHR</Departure> + <Arrival>SNG</Arrival> + </Flight> + <Flight flightNo="SG561"> + <Departure>SNG</Departure> + <Arrival>LHR</Arrival> + </Flight> + <Hotel cardsAccepted="true"> + <Name>Excelsior</Name> + <Phone>222-3333</Phone> + <Room booked="true">303</Room> + </Hotel> + <Hotel> + <Name>Seedy Lodge</Name> + <Phone>888-9999</Phone> + <Room booked="true">14</Room> + </Hotel> + <Hotel cardsAccepted="true"> + <Name>Hilton</Name> + <Phone>444-5555</Phone> + <Room booked="false">456</Room> + <foo>foo</foo> + </Hotel> + <Excursion> + <Title>Bird Baths of Singapore</Title> + <Cost>50</Cost> + </Excursion> + <Client> + <Name>Steve</Name> + <Address>134 Shirley Road</Address> + <CreditCard>1234-8908-6543-900</CreditCard> + </Client> + <Party> + <Person> + <Name>John</Name> + </Person> + <Person> + <Name>Jane</Name> + </Person> + <Person> + <Name>Bill</Name> + </Person> + </Party> +</Holiday> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/axis.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/axis.xsd new file mode 100644 index 0000000000..3ea0033a7c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/axis.xsd @@ -0,0 +1,36 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns="axis" targetNamespace="axis"> +<xsd:element name="ItemSearch" > + <xsd:complexType > + <xsd:sequence> +<xsd:element name="SubscriptionId" type="xsd:string" minOccurs="0" /> +<xsd:element name="AssociateTag" type="xsd:string" minOccurs="0" /> +<xsd:element name="XMLEscaping" type="xsd:string" minOccurs="0" /> +<xsd:element name="Validate" type="xsd:string" minOccurs="0" /> +<xsd:element name="Shared" type="tns:ItemSearchRequest" minOccurs="0" /> +<xsd:element name="Request" type="tns:ItemSearchRequest" minOccurs="0" maxOccurs="unbounded" /> +</xsd:sequence> +</xsd:complexType> +</xsd:element> + <xsd:complexType name="ItemSearchRequest"> + <xsd:sequence> +<xsd:element name="Keywords" type="xsd:string" minOccurs="0" /> +<xsd:element name="SearchIndex" type="xsd:string" minOccurs="0" /> +</xsd:sequence> +</xsd:complexType> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617.xml new file mode 100644 index 0000000000..84a51b73ec --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Eastleigh Borough Council" employeeOfTheMonth="#/CEO"><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Carl Marx" SN="E0003"/></departments><CEO name="Bridget Jones" SN="E0002" manager="true"/></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617.xsd new file mode 100644 index 0000000000..ea75c0c8b9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617.xsd @@ -0,0 +1 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns="companyNS" targetNamespace="companyNS"><xsd:element name="companyType" type="CompanyType"/><xsd:complexType name="CompanyType"><xsd:sequence><xsd:element name="departments" type="tns:DepartmentType" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="CEO" type="tns:EmployeeType" minOccurs="0"/></xsd:sequence><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="employeeOfTheMonth" sdoxml:propertyType="tns:EmployeeType" type="xsd:IDREF"/></xsd:complexType><xsd:element name="departmentType" type="DepartmentType"/><xsd:complexType name="DepartmentType"><xsd:sequence><xsd:element name="employees" type="tns:EmployeeType" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="name" type="xsd:String" minOccurs="0"/><xsd:element name="location" type="xsd:String" minOccurs="0"/><xsd:element name="number" type="xsd:String" minOccurs="0"/></xsd:sequence></xsd:complexType><xsd:element name="employeeType" type="EmployeeType"/><xsd:complexType name="EmployeeType"><xsd:sequence><xsd:element name="name" type="xsd:String" minOccurs="0"/><xsd:element name="SN" type="xsd:String" minOccurs="0"/><xsd:element name="manager" type="xsd:boolean" minOccurs="0"/></xsd:sequence></xsd:complexType></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617b.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617b.xml new file mode 100644 index 0000000000..3ccd70a40b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617b.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<companyType xmlns="companyNS" xsi:type="CompanyType" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="#/CEO"> +<departments name="Shoe"> +<employees name="Sarah Jones"/> +</departments> +<CEO name="Fred Smith"/> +</companyType> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617b.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617b.xsd new file mode 100644 index 0000000000..ae0d3a4bda --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46617b.xsd @@ -0,0 +1,70 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" +xmlns:tns="companyNS" targetNamespace="companyNS"> +<xsd:element name="employeeType" type="tns:EmployeeType"/> +<xsd:complexType name="EmployeeType"> +<xsd:sequence> +<xsd:element name="name" type="xsd:String" minOccurs="0"/> +<xsd:element name="SN" type="xsd:String" minOccurs="0"/> +<xsd:element name="manager" type="xsd:boolean" minOccurs="0"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="departmentType" type="tns:DepartmentType"/> +<xsd:complexType name="DepartmentType"> +<xsd:sequence><xsd:element name="name" type="xsd:String" minOccurs="0"/> +<xsd:element name="location" type="xsd:String" minOccurs="0"/> +<xsd:element name="number" type="xsd:integer" minOccurs="0"/> +<xsd:element name="employees" type="tns:EmployeeType" minOccurs="0" maxOccurs="unbounded"/> +</xsd:sequence> +</xsd:complexType> +<xsd:element name="companyType" type="tns:CompanyType"/> +<xsd:complexType name="CompanyType" mixed="true"> +<xsd:choice maxOccurs="unbounded"> +<xsd:element name="name" type="xsd:String" minOccurs="0"/> +<xsd:element name="departments" type="tns:DepartmentType" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="CEO" type="tns:EmployeeType" minOccurs="0"/> +<xsd:element name="string" type="xsd:String" minOccurs="0"/> +<xsd:element name="bool" type="xsd:boolean" minOccurs="0"/> +<xsd:element name="byte" type="xsd:byte" minOccurs="0"/> +<xsd:element name="bytes" type="xsd:hexBinary" minOccurs="0"/> +<xsd:element name="char" type="xsd:string" minOccurs="0"/> +<xsd:element name="date" type="xsd:dateTime" minOccurs="0"/> +<xsd:element name="double" type="xsd:double" minOccurs="0"/> +<xsd:element name="float" type="xsd:float" minOccurs="0"/> +<xsd:element name="int" type="xsd:integer" minOccurs="0"/> +<xsd:element name="long" type="xsd:long" minOccurs="0"/> +<xsd:element name="short" type="xsd:short" minOccurs="0"/> +<xsd:element name="uri" type="xsd:anyURI" minOccurs="0"/> +<xsd:element name="Mstring" type="xsd:String" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mbool" type="xsd:boolean" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mbyte" type="xsd:byte" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mbytes" type="xsd:hexBinary" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mchar" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mdate" type="xsd:dateTime" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mdouble" type="xsd:double" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mfloat" type="xsd:float" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mint" type="xsd:integer" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mlong" type="xsd:long" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Mshort" type="xsd:short" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="Muri" type="xsd:anyURI" minOccurs="0" maxOccurs="unbounded"/> +</xsd:choice> +<xsd:element name="changeSummary" type="sdo:ChangeSummaryType"/> +<xsd:attribute name="employeeOfTheMonth" sdoxml:propertyType="tns:EmployeeType" type="xsd:IDREF"/> +</xsd:complexType> +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46633.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46633.txt new file mode 100644 index 0000000000..da34a5196e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46633.txt @@ -0,0 +1,8 @@ +A modified of type myspace#Department +Property employees[(null)] was unset before the change +Property ints[(null)] was unset before the change +Property bool was unset before the change +A modified of type myspace#Department +Property employees[(null)] was unset before the change +Property ints[(null)] was unset before the change +Property bool was unset before the change diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46634_out.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46634_out.txt new file mode 100644 index 0000000000..b228d4052c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46634_out.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp"><departments name="Advanced Technologies" location="NY" number="123"><employees><name>Jane Doe</name><employees xmlns="companyNS" xsi:nil="true"/></employees></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46634_out.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46634_out.xml new file mode 100644 index 0000000000..b228d4052c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46634_out.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp"><departments name="Advanced Technologies" location="NY" number="123"><employees><name>Jane Doe</name><employees xmlns="companyNS" xsi:nil="true"/></employees></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46693.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46693.xsd new file mode 100644 index 0000000000..8488597741 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b46693.xsd @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="utf-8" ?> + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:s="http://www.w3.org/2001/XMLSchema" + xmlns:s0="http://swanandmokashi.com" + xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" + xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" + xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" + targetNamespace="http://swanandmokashi.com" + xmlns="http://schemas.xmlsoap.org/wsdl/"> + <types> + <s:schema elementFormDefault="qualified" + targetNamespace="http://swanandmokashi.com"> + <s:element name="GetQuotes"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="QuoteTicker" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="GetQuotesResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="GetQuotesResult" type="s0:ArrayOfQuote" /> + </s:sequence> + </s:complexType> + </s:element> + <s:complexType name="ArrayOfQuote"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" + name="Quote" type="s0:Quote" /> + </s:sequence> + </s:complexType> + <s:complexType name="Quote"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="CompanyName" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="StockTicker" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="StockQuote" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="LastUpdated" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="Change" + type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="OpenPrice" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="DayHighPrice" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="DayLowPrice" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="Volume" + type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="MarketCap" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" + name="YearRange" type="s:string" /> + </s:sequence> + </s:complexType> + <s:element name="ArrayOfQuote" nillable="true" + type="s0:ArrayOfQuote" /> + </s:schema> + </types> + <message name="GetQuotesSoapIn"> + <part name="parameters" element="s0:GetQuotes" /> + </message> + <message name="GetQuotesSoapOut"> + <part name="parameters" element="s0:GetQuotesResponse" /> + </message> + <message name="GetQuotesHttpGetIn"> + <part name="QuoteTicker" type="s:string" /> + </message> + <message name="GetQuotesHttpGetOut"> + <part name="Body" element="s0:ArrayOfQuote" /> + </message> + <message name="GetQuotesHttpPostIn"> + <part name="QuoteTicker" type="s:string" /> + </message> + <message name="GetQuotesHttpPostOut"> + <part name="Body" element="s0:ArrayOfQuote" /> + </message> + <portType name="StockQuotesSoap"> + <operation name="GetStockQuotes"> + <input name="GetQuotes" message="s0:GetQuotesSoapIn" /> + <output name="GetQuotes" message="s0:GetQuotesSoapOut" /> + </operation> + </portType> + <portType name="StockQuotesHttpGet"> + <operation name="GetStockQuotes"> + <input name="GetQuotes" message="s0:GetQuotesHttpGetIn" /> + <output name="GetQuotes" message="s0:GetQuotesHttpGetOut" /> + </operation> + </portType> + <portType name="StockQuotesHttpPost"> + <operation name="GetStockQuotes"> + <input name="GetQuotes" message="s0:GetQuotesHttpPostIn" /> + <output name="GetQuotes" message="s0:GetQuotesHttpPostOut" /> + </operation> + </portType> + <binding name="StockQuotesSoap" type="s0:StockQuotesSoap"> + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" + style="document" /> + <operation name="GetStockQuotes"> + <soap:operation + soapAction="http://swanandmokashi.com/GetQuotes" style="document" /> + <input name="GetQuotes"> + <soap:body use="literal" /> + </input> + <output name="GetQuotes"> + <soap:body use="literal" /> + </output> + </operation> + </binding> + <binding name="StockQuotesHttpGet" type="s0:StockQuotesHttpGet"> + <http:binding verb="GET" /> + <operation name="GetStockQuotes"> + <http:operation location="/GetQuotes" /> + <input name="GetQuotes"> + <http:urlEncoded /> + </input> + <output name="GetQuotes"> + <mime:mimeXml part="Body" /> + </output> + </operation> + </binding> + <binding name="StockQuotesHttpPost" type="s0:StockQuotesHttpPost"> + <http:binding verb="POST" /> + <operation name="GetStockQuotes"> + <http:operation location="/GetQuotes" /> + <input name="GetQuotes"> + <mime:content type="application/x-www-form-urlencoded" /> + </input> + <output name="GetQuotes"> + <mime:mimeXml part="Body" /> + </output> + </operation> + </binding> + <service name="StockQuotes"> + <port name="StockQuotesSoap" binding="s0:StockQuotesSoap"> + <soap:address + location="http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx" /> + </port> + <port name="StockQuotesHttpGet" + binding="s0:StockQuotesHttpGet"> + <http:address + location="http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx" /> + </port> + <port name="StockQuotesHttpPost" + binding="s0:StockQuotesHttpPost"> + <http:address + location="http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx" /> + </port> + </service> +</definitions> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137.txt new file mode 100644 index 0000000000..d525bd7776 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137.txt @@ -0,0 +1,6 @@ +Property:value +Property:isPermaLink +Property:value +Value:Hello +Property:isPermaLink +Value:true diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137.xsd new file mode 100644 index 0000000000..90f78c7398 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema version="1.1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="guid" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:extension base="xs:string"> + <xs:attribute name="isPermaLink" use="optional" type="xs:boolean"> + </xs:attribute> + </xs:extension> + </xs:complexType> + </xs:element> +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137_out.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137_out.xml new file mode 100644 index 0000000000..1bb06f8f0a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137_out.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<fluid xsi:type="guid" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" isPermaLink="true">Hello</fluid> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b.txt new file mode 100644 index 0000000000..202a17fc21 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b.txt @@ -0,0 +1,31 @@ +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:companyNS#CompanyType +Type:companyNS#DepartmentType +Type:companyNS#EmployeeType +Type:companyNS#RootType +Type:companyNS#guid +Property:departments +Property:guid +Property:name +Property:employeeOfTheMonth +Property:departments +Property:guid +guid Value:Wilbur +guid isPermaLink:Property:name +Property:employeeOfTheMonth diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b.xsd new file mode 100644 index 0000000000..5282a4b4ba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b.xsd @@ -0,0 +1,55 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:element name="guid" minOccurs="0" maxOccurs="1"> + <xsd:complexType> + <xsd:extension base="xsd:string"> + <xsd:attribute name="isPermaLink" use="optional" type="xsd:boolean"> + </xsd:attribute> + </xsd:extension> + </xsd:complexType> + </xsd:element> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b_out.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b_out.xml new file mode 100644 index 0000000000..28de3c4f9f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47137b_out.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sdo:changeSummary xmlns:sdo="commonj.sdo"/><guid isPermaLink="true">Wilbur</guid></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47293.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47293.txt new file mode 100644 index 0000000000..9d571da67c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b47293.txt @@ -0,0 +1,27 @@ +Type:catalogNS#CatalogTypeType:catalogNS#RootTypeType:commonj.sdo#BigDecimalType:commonj.sdo#BigIntegerType:commonj.sdo#BooleanType:commonj.sdo#ByteType:commonj.sdo#BytesType:commonj.sdo#ChangeSummaryType:commonj.sdo#CharacterType:commonj.sdo#DataObjectType:commonj.sdo#DateType:commonj.sdo#DoubleType:commonj.sdo#FloatType:commonj.sdo#IntegerType:commonj.sdo#LongType:commonj.sdo#OpenDataObjectType:commonj.sdo#ShortType:commonj.sdo#StringType:commonj.sdo#URIType:customerNS#AddressTypeType:customerNS#CustomerTypeType:customerNS#PaymentTypeType:customerNS#RootTypeType:orderNS#OrderStatusType:orderNS#OrderTypeType:orderNS#RootTypeType:orderNS#itemType:catalogNS#CatalogType +Type:catalogNS#RootType +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:customerNS#AddressType +Type:customerNS#CustomerType +Type:customerNS#PaymentType +Type:customerNS#RootType +Type:orderNS#OrderStatus +Type:orderNS#OrderType +Type:orderNS#RootType +Type:orderNS#item diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48602.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48602.xsd new file mode 100644 index 0000000000..dcb288f86a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48602.xsd @@ -0,0 +1,25 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > + <xs:element name="address" type="Address"/> +<xs:complexType name="Address"> + <xs:sequence> +<xs:element name="name" type="string"/> +</xs:sequence> +</xs:complexType > +</xs:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633.xml new file mode 100644 index 0000000000..ffb7a039d4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633.xml @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<name + xmlns="http://www.wrox.com/name" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" + xsi:schemaLocation="http://www.wrox.com/name name.xsd" + title="Mr."> + <first>John</first> + <middle>Fitzgerald</middle> + <last>Doe</last> +</name> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633.xsd new file mode 100644 index 0000000000..0a7c526c02 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.wrox.com/name" + xmlns:tns="http://www.wrox.com/name" + elementFormDefault="qualified"> + + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + + <complexType name="NameType"> + <sequence> + <element ref="tns:first"/> + <element ref="tns:middle"/> + <element ref="tns:last"/> + </sequence> + <attribute name="title" type="string"/> + </complexType> + + <element name="name" type="tns:NameType"/> +</schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633_xml.txt new file mode 100644 index 0000000000..7c0425d298 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633_xml.txt @@ -0,0 +1,10 @@ +===== DataObject contents ===== +first:string:John + +middle:string:Fitzgerald + +last:string:Doe + +title:string:Mr. + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633b.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633b.xsd new file mode 100644 index 0000000000..c9bca4a9c3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633b.xsd @@ -0,0 +1,22 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="TNS" + xmlns:v="TNS"> +<element name="version" type="string"/> +</schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633b_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633b_xsd.txt new file mode 100644 index 0000000000..0836fda6cd --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48633b_xsd.txt @@ -0,0 +1,31 @@ +***** TESTANY ****************************************** +Type:TNS#RootType +Property:version of type String +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#NameType +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +Type:http://www.wrox.com/name#RootType +Property:first of type String +Property:middle of type String +Property:last of type String +Property:name of type NameType +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636.xml new file mode 100644 index 0000000000..1edcdf37c1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636.xml @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<name + xmlns="http://www.wrox.com/name" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.wrox.com/name name8.xsd" + title="Mr."> + <first>John</first> + <middle>Fitzgerald</middle> + <last>Doe</last> +</name> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636.xsd new file mode 100644 index 0000000000..5387611997 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636.xsd @@ -0,0 +1,33 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + </group> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636_xml.txt new file mode 100644 index 0000000000..4b5b55ced7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636_xml.txt @@ -0,0 +1,36 @@ +***** TYPES AFTER RESOLVE********************************* +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +*******************************END TYPES****************** +===== DataObject contents ===== +first:string:John + +middle:string:Fitzgerald + +last:string:Doe + +title:string:Mr. + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636_xsd.txt new file mode 100644 index 0000000000..81ccaee474 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48636_xsd.txt @@ -0,0 +1,26 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686.xml new file mode 100644 index 0000000000..19e3ea93fe --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686.xml @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<name + xmlns="http://www.wrox.com/name" + xmlns:xsi="http://www.w3.org/2001/XMLSchem-Instance" + xsi:schemaLocation="http://www.wrox.com/name name.xsd"> + <first>John</first> + <middle>Fitzgerald</middle> + <last>Doe</last> + <ages>1 2 3</ages> +</name> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686.xsd new file mode 100644 index 0000000000..c06650bba6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.wrox.com/name" + xmlns:tns="http://www.wrox.com/name"> + + <element name="name"> + <complexType> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + <element name="ages"> + <simpleType> + <list itemType="positiveInteger"/> + </simpleType> + </element> + </sequence> + </complexType> + </element> + + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686_xml.txt new file mode 100644 index 0000000000..f4899d810e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686_xml.txt @@ -0,0 +1,46 @@ +***** TYPES AFTER RESOLVE********************************* +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#ages +Property:values (many) of type Integer +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:ages (many) of type ages +*******************************END TYPES****************** +===== DataObject contents ===== +first:string:John + +middle:string:Fitzgerald + +last:string:Doe + +ages: list dataObject[0]= +===== DataObject contents ===== +values: list integer[0]=1 + +integer[1]=2 + +integer[2]=3 + +===== End DataObject ===== + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686_xsd.txt new file mode 100644 index 0000000000..df670b8066 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/b48686_xsd.txt @@ -0,0 +1,28 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#ages +Property:values (many) of type Integer +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:ages (many) of type ages +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/badelement.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/badelement.txt new file mode 100644 index 0000000000..f9ddc1e3b1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/badelement.txt @@ -0,0 +1,2 @@ +BADELEMENT correctly found errors: +Parser found unknown element ThisJustAintPartOfTheSchema diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroups.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroups.xsd new file mode 100644 index 0000000000..d5a27a8cd5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroups.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + </group> + <attributeGroup name="NameAttributeGroup"> + <attribute name="firstattribute" type="string"/> + <attribute name="secondattribute" type="string"/> + <attribute name="thirdattribute" type="string"/> + </attributeGroup> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + <attributeGroup ref="target:NameAttributeGroup"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroups_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroups_xsd.txt new file mode 100644 index 0000000000..5d92da21c5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroups_xsd.txt @@ -0,0 +1,29 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +Property:firstattribute of type String +Property:secondattribute of type String +Property:thirdattribute of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroupssamename.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroupssamename.xsd new file mode 100644 index 0000000000..4648a9e917 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroupssamename.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + </group> + <attributeGroup name="NameGroup"> + <attribute name="firstattribute" type="string"/> + <attribute name="secondattribute" type="string"/> + <attribute name="thirdattribute" type="string"/> + </attributeGroup> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + <attributeGroup ref="target:NameGroup"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroupssamename_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroupssamename_xsd.txt new file mode 100644 index 0000000000..5d92da21c5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bothgroupssamename_xsd.txt @@ -0,0 +1,29 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +Property:firstattribute of type String +Property:secondattribute of type String +Property:thirdattribute of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug2.txt new file mode 100644 index 0000000000..aae01a0c9c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug2.txt @@ -0,0 +1,9 @@ +MObject Property companies +Property:name:Acme +End of MObject Property companies +MObject Property companies +End of MObject Property companies +Change summary should have no entries... +MObject Property companies +End of MObject Property companies +Change summary should have no entries... diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug45933-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug45933-output.txt new file mode 100644 index 0000000000..366d41ef02 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug45933-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Bug45933"><sdo:changeSummary xmlns:sdo="commonj.sdo"><company sdo:ref="#/"><bools>false</bools></company></sdo:changeSummary></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug45933-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug45933-output.xml new file mode 100644 index 0000000000..366d41ef02 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug45933-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Bug45933"><sdo:changeSummary xmlns:sdo="commonj.sdo"><company sdo:ref="#/"><bools>false</bools></company></sdo:changeSummary></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300.xml new file mode 100644 index 0000000000..77ccd72ba6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<template:template xmlns:template="http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/" name="CTShop" version="1.0.0"> + <description>This is my online shop</description> + <displayName>The CT Shop</displayName> + <templateType>php</templateType> + <verifiers/> + <globalHelperArguments> + </globalHelperArguments> + <unboundTemplateParameters name="name" expert="false" multiplicity="1..1"> + <description> + <description>Name for the shop</description> + <displayName>Shop Name</displayName> + </description> + <verifiers> + </verifiers> + <constraints> + </constraints> + <defaults> + <description></description> + <displayName>CT Shop</displayName> + <data>CT Shop</data> + </defaults> + </unboundTemplateParameters> + <unboundTemplateParameters name="branding" expert="false" multiplicity="1..1"> + <description> + <description>Colour of background for Shop</description> + <displayName>Branding</displayName> + </description> + <verifiers> + </verifiers> + <constraints> + <description></description> + <displayName>Olive</displayName> + <data>Olive</data> + </constraints> + <constraints> + <description></description> + <displayName>Lime</displayName> + <data>Lime</data> + </constraints> + <constraints> + <description></description> + <displayName>Gray</displayName> + <data>Gray</data> + </constraints> + <constraints> + <description></description> + <displayName>Teal</displayName> + <data>Teal</data> + </constraints> + <constraints> + <description></description> + <displayName>Silver</displayName> + <data>Silver</data> + </constraints> + <constraints> + <description></description> + <displayName>White</displayName> + <data>White</data> + </constraints> + <defaults> + <description></description> + <displayName>Olive</displayName> + <data>Olive</data> + </defaults> + </unboundTemplateParameters> + <unboundTemplateParameters name="catalog" expert="false" multiplicity="1..1"> + <description> + <description>Product Catalog for the shop</description> + <displayName>Product Catalog</displayName> + </description> + <verifiers> + </verifiers> + <constraints> + </constraints> + <factory kind="php" name="CatalogFactory"> + </factory> + <defaults> + <description></description> + <displayName>Catalog</displayName> + <data>Catalog</data> + </defaults> + </unboundTemplateParameters> + <unboundTemplateParameters name="cart" expert="false" multiplicity="1..1"> + <description> + <description>Shopping cart for the shop</description> + <displayName>Shopping Cart</displayName> + </description> + <verifiers> + </verifiers> + <constraints> + <description></description> + <displayName>Cart</displayName> + <data>Cart</data> + </constraints> + <constraints> + <description></description> + <displayName>GCCart</displayName> + <data>GCCart</data> + </constraints> + <constraints> + <description></description> + <displayName>MyCart</displayName> + <data>MyCart</data> + </constraints> + <factory kind="php" name="CartFactory"> + </factory> + <defaults> + <description></description> + <displayName>Cart</displayName> + <data>Cart</data> + </defaults> + </unboundTemplateParameters> + <unboundTemplateParameters name="payment" expert="false" multiplicity="1..1"> + <description> + <description>Payment Modules for the shop</description> + <displayName>Payment Module</displayName> + </description> + <verifiers> + </verifiers> + <constraints> + <description></description> + <displayName>MyPayPal</displayName> + <data>MyPayPal</data> + </constraints> + <constraints> + <description></description> + <displayName>PayPal</displayName> + <data>PayPal</data> + </constraints> + <constraints> + <description></description> + <displayName>USPayPal</displayName> + <data>USPayPal</data> + </constraints> + <constraints> + <description></description> + <displayName>MyStormPay</displayName> + <data>MyStormPay</data> + </constraints> + <constraints> + <description></description> + <displayName>StormPay</displayName> + <data>StormPay</data> + </constraints> + <factory kind="php" name="PaymentFactory"> + </factory> + <defaults> + <description></description> + <displayName>PayPal</displayName> + <data>PayPal</data> + </defaults> + </unboundTemplateParameters> + </template:template>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300.xsd new file mode 100644 index 0000000000..e6bdb8128b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300.xsd @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:template="http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/" + targetNamespace="http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/"> + + <element name="template" type="template:TemplateType"> + <complexType name="TemplateType"> + <sequence> + <element name="displayName" type="string"/> + <element name="templateType" type="string"/> + <element name="description" type="string"/> + <element name="expert" type="string"/> + <element name="icon" type="string"/> + <element name="verifiers" minOccurs="0" maxOccurs="unbounded" type="string"/> + <element name="globalHelperArguments" minOccurs="0" maxOccurs="unbounded" type="string"/> + <element name="unboundTemplateParameters" minOccurs="0" maxOccurs="unbounded" ref="template:unboundTemplateParameter"/> + <attribute name="name" type="string"/> + <attribute name="version" type="string"/> + </sequence> + </complexType> + </element> + + <element name="unboundTemplateParameter"> + <complexType> + <element name="description" minOccurs="0" maxOccurs="1" ref="template:description"/> + <element name="verifiers" minOccurs="0" maxOccurs="unbounded" type="string"/> + <element name="constraints" minOccurs="0" maxOccurs="unbounded" ref="template:value"/> + <element name="factory" minOccurs="0" maxOccurs="1" ref="template:factory"/> + <element name="defaults" minOccurs="0" maxOccurs="unbounded" ref="template:value"/> + <attribute name="name" type="string"/> + <attribute name="expert" type="string"/> + <attribute name="multiplicity" type="string"/> + </complexType> + </element> + + <element name="description"> + <complexType> + <element name="description" type="string"/> + <element name="displayName" type="string"/> + </complexType> + </element> + + <element name="factory"> + <complexType> + <attribute name="kind" type="string"/> + <attribute name="name" type="string"/> + </complexType> + </element> + + <element name="valueprovider"> + <complexType> + <element name="values" minOccurs="0" maxOccurs="unbounded" ref="template:value"/> + </complexType> + </element> + + <element name="value"> + <complexType> + <element name="description" type="string"/> + <element name="displayName" type="string"/> + <element name="data" type="string"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300_xml.txt new file mode 100644 index 0000000000..d8b1345d0d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300_xml.txt @@ -0,0 +1,424 @@ +***** TYPES AFTER RESOLVE********************************* +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#RootType +Property:template of type TemplateType +Property:unboundTemplateParameter of type unboundTemplateParameter +Property:description of type description +Property:factory of type factory +Property:valueprovider of type valueprovider +Property:value of type value +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#TemplateType +Property:displayName of type String +Property:templateType of type String +Property:description of type String +Property:expert of type String +Property:icon of type String +Property:verifiers (many) of type String +Property:globalHelperArguments (many) of type String +Property:unboundTemplateParameters (many) of type unboundTemplateParameter +Property:name of type String +Property:version of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#description +Property:description of type String +Property:displayName of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#factory +Property:kind of type String +Property:name of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#unboundTemplateParameter +Property:description of type description +Property:verifiers (many) of type String +Property:constraints (many) of type value +Property:factory of type factory +Property:defaults (many) of type value +Property:name of type String +Property:expert of type String +Property:multiplicity of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#value +Property:description of type String +Property:displayName of type String +Property:data of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#valueprovider +Property:values (many) of type value +*******************************END TYPES****************** +===== DataObject contents ===== +displayName:string:The CT Shop + +templateType:string:php + +description:string:This is my online shop + +expert:string: + +icon:string: + +verifiers: list string[0]= + +globalHelperArguments: list string[0]= + + +unboundTemplateParameters: list dataObject[0]= +===== DataObject contents ===== +description:dataObject +===== DataObject contents ===== +description:string:Name for the shop + +displayName:string:Shop Name + +===== End DataObject ===== + +verifiers: list string[0]= + + +constraints: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string: + +data:string: + +===== End DataObject ===== + +factory:dataObject + - null or unset + +defaults: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:CT Shop + +data:string:CT Shop + +===== End DataObject ===== + +name:string:name + +expert:string:false + +multiplicity:string:1..1 + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +description:dataObject +===== DataObject contents ===== +description:string:Colour of background for Shop + +displayName:string:Branding + +===== End DataObject ===== + +verifiers: list string[0]= + + +constraints: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:Olive + +data:string:Olive + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +description:string: + +displayName:string:Lime + +data:string:Lime + +===== End DataObject ===== + +dataObject[2]= +===== DataObject contents ===== +description:string: + +displayName:string:Gray + +data:string:Gray + +===== End DataObject ===== + +dataObject[3]= +===== DataObject contents ===== +description:string: + +displayName:string:Teal + +data:string:Teal + +===== End DataObject ===== + +dataObject[4]= +===== DataObject contents ===== +description:string: + +displayName:string:Silver + +data:string:Silver + +===== End DataObject ===== + +dataObject[5]= +===== DataObject contents ===== +description:string: + +displayName:string:White + +data:string:White + +===== End DataObject ===== + +factory:dataObject + - null or unset + +defaults: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:Olive + +data:string:Olive + +===== End DataObject ===== + +name:string:branding + +expert:string:false + +multiplicity:string:1..1 + +===== End DataObject ===== + +dataObject[2]= +===== DataObject contents ===== +description:dataObject +===== DataObject contents ===== +description:string:Product Catalog for the shop + +displayName:string:Product Catalog + +===== End DataObject ===== + +verifiers: list string[0]= + + +constraints: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string: + +data:string: + +===== End DataObject ===== + +factory:dataObject +===== DataObject contents ===== +kind:string:php + +name:string:CatalogFactory + +===== End DataObject ===== + +defaults: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:Catalog + +data:string:Catalog + +===== End DataObject ===== + +name:string:catalog + +expert:string:false + +multiplicity:string:1..1 + +===== End DataObject ===== + +dataObject[3]= +===== DataObject contents ===== +description:dataObject +===== DataObject contents ===== +description:string:Shopping cart for the shop + +displayName:string:Shopping Cart + +===== End DataObject ===== + +verifiers: list string[0]= + + +constraints: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:Cart + +data:string:Cart + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +description:string: + +displayName:string:GCCart + +data:string:GCCart + +===== End DataObject ===== + +dataObject[2]= +===== DataObject contents ===== +description:string: + +displayName:string:MyCart + +data:string:MyCart + +===== End DataObject ===== + +factory:dataObject +===== DataObject contents ===== +kind:string:php + +name:string:CartFactory + +===== End DataObject ===== + +defaults: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:Cart + +data:string:Cart + +===== End DataObject ===== + +name:string:cart + +expert:string:false + +multiplicity:string:1..1 + +===== End DataObject ===== + +dataObject[4]= +===== DataObject contents ===== +description:dataObject +===== DataObject contents ===== +description:string:Payment Modules for the shop + +displayName:string:Payment Module + +===== End DataObject ===== + +verifiers: list string[0]= + + +constraints: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:MyPayPal + +data:string:MyPayPal + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +description:string: + +displayName:string:PayPal + +data:string:PayPal + +===== End DataObject ===== + +dataObject[2]= +===== DataObject contents ===== +description:string: + +displayName:string:USPayPal + +data:string:USPayPal + +===== End DataObject ===== + +dataObject[3]= +===== DataObject contents ===== +description:string: + +displayName:string:MyStormPay + +data:string:MyStormPay + +===== End DataObject ===== + +dataObject[4]= +===== DataObject contents ===== +description:string: + +displayName:string:StormPay + +data:string:StormPay + +===== End DataObject ===== + +factory:dataObject +===== DataObject contents ===== +kind:string:php + +name:string:PaymentFactory + +===== End DataObject ===== + +defaults: list dataObject[0]= +===== DataObject contents ===== +description:string: + +displayName:string:PayPal + +data:string:PayPal + +===== End DataObject ===== + +name:string:payment + +expert:string:false + +multiplicity:string:1..1 + +===== End DataObject ===== + +name:string:CTShop + +version:string:1.0.0 + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300_xsd.txt new file mode 100644 index 0000000000..38d7c904f0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bug48300_xsd.txt @@ -0,0 +1,58 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#RootType +Property:template of type TemplateType +Property:unboundTemplateParameter of type unboundTemplateParameter +Property:description of type description +Property:factory of type factory +Property:valueprovider of type valueprovider +Property:value of type value +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#TemplateType +Property:displayName of type String +Property:templateType of type String +Property:description of type String +Property:expert of type String +Property:icon of type String +Property:verifiers (many) of type String +Property:globalHelperArguments (many) of type String +Property:unboundTemplateParameters (many) of type unboundTemplateParameter +Property:name of type String +Property:version of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#description +Property:description of type String +Property:displayName of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#factory +Property:kind of type String +Property:name of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#unboundTemplateParameter +Property:description of type description +Property:verifiers (many) of type String +Property:constraints (many) of type value +Property:factory of type factory +Property:defaults (many) of type value +Property:name of type String +Property:expert of type String +Property:multiplicity of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#value +Property:description of type String +Property:displayName of type String +Property:data of type String +Type:http://www.ibm.com/xmlns/prod/ct/ctdl-template/v1.0.0/#valueprovider +Property:values (many) of type value +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/company.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/company.xml new file mode 100644 index 0000000000..8e130ae2aa --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/company.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<mci:company xmlns:mci="http://www.mycompanyinc.com" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.mycompanyinc.com company.xsd" + version="0.0.1"> + <mci:employees> + <mci:employee> + <mci:id>1</mci:id> + <mci:name>Mary Kay</mci:name> + </mci:employee> + </mci:employees> + <mci:departments> + <mci:department> + <mci:id>3</mci:id> + <mci:name>Sales</mci:name> + <mci:employeesList> + <mci:ids>1</mci:ids> + </mci:employeesList> + </mci:department> + </mci:departments> +</mci:company>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/company.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/company.xsd new file mode 100644 index 0000000000..34a66c282a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/company.xsd @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema targetNamespace="http://www.mycompanyinc.com" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:mci="http://www.mycompanyinc.com" elementFormDefault="qualified" + version="0.0.1"> + <xsd:complexType name="employeesListType"> + <xsd:sequence> + <xsd:element name="ids" type="xsd:string" minOccurs="0" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="employeeType"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="departmentType"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + <xsd:element name="employeesList" type="mci:employeesListType" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="employeesType"> + <xsd:sequence> + <xsd:element name="employee" type="mci:employeeType" maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="departmentsType"> + <xsd:sequence> + <xsd:element name="department" type="mci:departmentType" minOccurs="0" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="companyType"> + <xsd:sequence> + <xsd:element name="employees" type="mci:employeesType" /> + <xsd:element name="departments" type="mci:departmentsType" /> + </xsd:sequence> + <xsd:attribute name="version" type="xsd:string" use="required" /> + </xsd:complexType> + <xsd:element name="company" type="mci:companyType" /> +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/include.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/include.xsd new file mode 100644 index 0000000000..f2df5c1695 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/include.xsd @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema targetNamespace="http://www.mycompanyinc.com" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:mci="http://www.mycompanyinc.com" elementFormDefault="qualified" + version="0.0.1"> + + <xsd:include schemaLocation="c:/absolute-drivel/ok1.xsd" /> + <xsd:include schemaLocation="ok2.xsd" /> + <xsd:include schemaLocation="c:\\absolute-tosh\\ok3.xsd" /> + + <xsd:complexType name="employeesListType"> + <xsd:sequence> + <xsd:element name="ids" type="xsd:string" minOccurs="0" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="employeeType"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="departmentType"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + <xsd:element name="employeesList" type="mci:employeesListType" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="employeesType"> + <xsd:sequence> + <xsd:element name="employee" type="mci:employeeType" maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="departmentsType"> + <xsd:sequence> + <xsd:element name="department" type="mci:departmentType" minOccurs="0" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="companyType"> + <xsd:sequence> + <xsd:element name="employees" type="mci:employeesType" /> + <xsd:element name="departments" type="mci:departmentsType" /> + </xsd:sequence> + <xsd:attribute name="version" type="xsd:string" use="required" /> + </xsd:complexType> + <xsd:element name="company" type="mci:companyType" /> +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok1.xsd new file mode 100644 index 0000000000..e8bea67b49 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok1.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema targetNamespace="http://www.mycompanyinc.com" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:mci="http://www.mycompanyinc.com" elementFormDefault="qualified" + version="0.0.1"> + + <xsd:complexType name="ok1"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok2.xsd new file mode 100644 index 0000000000..9cecce2f7f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok2.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema targetNamespace="http://www.mycompanyinc.com" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:mci="http://www.mycompanyinc.com" elementFormDefault="qualified" + version="0.0.1"> + + <xsd:complexType name="ok2"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok3.xsd new file mode 100644 index 0000000000..f5bba60269 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bugs/1/ok3.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xsd:schema targetNamespace="http://www.mycompanyinc.com" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:mci="http://www.mycompanyinc.com" elementFormDefault="qualified" + version="0.0.1"> + + <xsd:complexType name="ok3"> + <xsd:sequence> + <xsd:element name="id" type="xsd:string" /> + <xsd:element name="name" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.txt new file mode 100644 index 0000000000..da1aabead7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.txt @@ -0,0 +1 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns1="nottest" xmlns:tns="test" targetNamespace="test"><xsd:element name="duplicate" type="tns1:Duplicate"/><xsd:complexType name="tns1:Duplicate"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer"/></xsd:complexType><xsd:element name="duplicate" type="Duplicate"/><xsd:complexType name="Duplicate"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer"/></xsd:complexType><xsd:element name="object" type="Object"/><xsd:complexType name="Object"/><xsd:element name="root" type="Root"/><xsd:complexType name="Root"><xsd:sequence><xsd:element name="duplicate" type="tns:Duplicate" minOccurs="0"/><xsd:element name="duplicate2" type="tns1:Duplicate" minOccurs="0"/><xsd:element name="unique" type="tns:Unique" minOccurs="0"/><xsd:element name="duplicatelist" type="tns:Duplicate" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="duplicatelist2" type="tns1:Duplicate" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="uniquelist" type="tns:Unique" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="unique" type="Unique"/><xsd:complexType name="Unique"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer"/></xsd:complexType></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xml new file mode 100644 index 0000000000..44650e05a4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rooty xmlns="test" xsi:type="Root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns2="nottest" xmlns:tns="test"><duplicate id="1"><ob/></duplicate><tns2:duplicate2 id="3"/><unique id="5"><ob/></unique><duplicatelist id="2"><ob/></duplicatelist><tns2:duplicatelist2 id="4"/><uniquelist id="6"/></rooty> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xsd new file mode 100644 index 0000000000..da1aabead7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xsd @@ -0,0 +1 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns1="nottest" xmlns:tns="test" targetNamespace="test"><xsd:element name="duplicate" type="tns1:Duplicate"/><xsd:complexType name="tns1:Duplicate"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer"/></xsd:complexType><xsd:element name="duplicate" type="Duplicate"/><xsd:complexType name="Duplicate"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer"/></xsd:complexType><xsd:element name="object" type="Object"/><xsd:complexType name="Object"/><xsd:element name="root" type="Root"/><xsd:complexType name="Root"><xsd:sequence><xsd:element name="duplicate" type="tns:Duplicate" minOccurs="0"/><xsd:element name="duplicate2" type="tns1:Duplicate" minOccurs="0"/><xsd:element name="unique" type="tns:Unique" minOccurs="0"/><xsd:element name="duplicatelist" type="tns:Duplicate" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="duplicatelist2" type="tns1:Duplicate" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="uniquelist" type="tns:Unique" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="unique" type="Unique"/><xsd:complexType name="Unique"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer"/></xsd:complexType></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xsd_safe.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xsd_safe.txt new file mode 100644 index 0000000000..1b4c6bb7da --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-out.xsd_safe.txt @@ -0,0 +1,53 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" +xmlns:tns1="nottest" xmlns:tns="test" targetNamespace="test"> + +<xsd:element name="duplicate" type="tns1:Duplicate"/> + +<xsd:complexType name="tns1:Duplicate"> + +<xsd:sequence> +<xsd:element name="ob" type="tns:Object" minOccurs="0"/> +</xsd:sequence> + +<xsd:attribute name="id" type="xsd:integer"/> + +</xsd:complexType> + +<xsd:element name="duplicate" type="Duplicate"/> + +<xsd:complexType name="Duplicate"> +<xsd:sequence> +<xsd:element name="ob" type="tns:Object" minOccurs="0"/> +</xsd:sequence> + +<xsd:attribute name="id" type="xsd:integer"/> + +</xsd:complexType> + +<xsd:element name="object" type="Object"/> + +<xsd:complexType name="Object"/> + +<xsd:element name="root" type="Root"/> + +<xsd:complexType name="Root"> +<xsd:sequence> +<xsd:element name="duplicate" type="tns:Duplicate" minOccurs="0"/> +<xsd:element name="duplicate2" type="tns1:Duplicate" minOccurs="0"/> +<xsd:element name="unique" type="tns:Unique" minOccurs="0"/> +<xsd:element name="duplicatelist" type="tns:Duplicate" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="duplicatelist2" type="tns1:Duplicate" minOccurs="0" maxOccurs="unbounded"/> +<xsd:element name="uniquelist" type="tns:Unique" minOccurs="0" maxOccurs="unbounded"/> +</xsd:sequence> +</xsd:complexType> + +<xsd:element name="unique" type="Unique"/> + +<xsd:complexType name="Unique"> +<xsd:sequence> +<xsd:element name="ob" type="tns:Object" minOccurs="0"/> +</xsd:sequence> +<xsd:attribute name="id" type="xsd:integer"/> +</xsd:complexType> + +</xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-outxml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-outxml.txt new file mode 100644 index 0000000000..44650e05a4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/bunique-outxml.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rooty xmlns="test" xsi:type="Root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns2="nottest" xmlns:tns="test"><duplicate id="1"><ob/></duplicate><tns2:duplicate2 id="3"/><unique id="5"><ob/></unique><duplicatelist id="2"><ob/></duplicatelist><tns2:duplicatelist2 id="4"/><uniquelist id="6"/></rooty> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.txt new file mode 100644 index 0000000000..44650e05a4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rooty xmlns="test" xsi:type="Root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns2="nottest" xmlns:tns="test"><duplicate id="1"><ob/></duplicate><tns2:duplicate2 id="3"/><unique id="5"><ob/></unique><duplicatelist id="2"><ob/></duplicatelist><tns2:duplicatelist2 id="4"/><uniquelist id="6"/></rooty> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.xml new file mode 100644 index 0000000000..44650e05a4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rooty xmlns="test" xsi:type="Root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns2="nottest" xmlns:tns="test"><duplicate id="1"><ob/></duplicate><tns2:duplicate2 id="3"/><unique id="5"><ob/></unique><duplicatelist id="2"><ob/></duplicatelist><tns2:duplicatelist2 id="4"/><uniquelist id="6"/></rooty> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.xsd new file mode 100644 index 0000000000..3b8cdffd61 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/buniqueread-out.xsd @@ -0,0 +1 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns1="nottest" xmlns:tns="test" targetNamespace="test"><xsd:element name="duplicate" type="tns1:Duplicate"/><xsd:complexType name="tns1:Duplicate"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/><xsd:element name="id" type="xsd:integer" minOccurs="0"/></xsd:sequence></xsd:complexType><xsd:element name="duplicate" type="Duplicate"/><xsd:complexType name="Duplicate"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/><xsd:element name="id" type="xsd:integer" minOccurs="0"/></xsd:sequence></xsd:complexType><xsd:element name="object" type="Object"/><xsd:complexType name="Object"/><xsd:element name="root" type="Root"/><xsd:complexType name="Root"><xsd:sequence><xsd:element name="duplicate" type="tns:Duplicate" minOccurs="0"/><xsd:element name="duplicate2" type="tns1:Duplicate" minOccurs="0"/><xsd:element name="unique" type="tns:Unique" minOccurs="0"/><xsd:element name="duplicatelist" type="tns:Duplicate" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="duplicatelist2" type="tns1:Duplicate" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="uniquelist" type="tns:Unique" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="unique" type="Unique"/><xsd:complexType name="Unique"><xsd:sequence><xsd:element name="ob" type="tns:Object" minOccurs="0"/><xsd:element name="id" type="xsd:integer" minOccurs="0"/></xsd:sequence></xsd:complexType></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator.xsd new file mode 100644 index 0000000000..d04b0c22e1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator.xsd @@ -0,0 +1,28 @@ +<?xml version="1.0" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:calc="http://example.org/CalculatorTypes" + targetNamespace="http://example.org/CalculatorTypes"> + <xsd:complexType name="AddArguments"> + <xsd:sequence> + <xsd:element name="a" type="xsd:float"/> + <xsd:element name="b" type="xsd:float"/> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator2.wsdl b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator2.wsdl new file mode 100644 index 0000000000..93cdce8874 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator2.wsdl @@ -0,0 +1,70 @@ +<?xml version ="1.0" encoding ="UTF-8" ?>
+<definitions name="Calculator"
+ targetNamespace="http://example.org/Calculator"
+ xmlns:calc="http://example.org/CalculatorTypes"
+ xmlns:tns="http://example.org/Calculator"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+
+<!-- This is how it's done with an import -->
+<types>
+ <xsd:schema targetNamespace="http://example.org/Calculator">
+ <xsd:import namespace="http://example.org/CalculatorTypes" schemaLocation="calculator.xsd"/>
+ </xsd:schema>
+</types>
+
+
+<!-- This is how it's done without an import
+<types>
+ <xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://example.org/Calculator">
+ <xsd:complexType name="AddArguments">
+ <xsd:sequence>
+ <xsd:element name="a" type="xsd:float"/>
+ <xsd:element name="b" type="xsd:float"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:schema>
+</types>
+-->
+
+<message name="getCalculatorRequest">
+ <part name="arguments" type="calc:AddArguments"/>
+</message>
+<message name="getCalculatorResponse">
+ <part name="result" type="xsd:float"/>
+</message>
+
+<portType name="CalculatorPortType">
+ <operation name="add2">
+ <input message="tns:getCalculatorRequest"/>
+ <output message="tns:getCalculatorResponse"/>
+ </operation>
+</portType>
+
+<binding name="CalculatorBinding" type="tns:CalculatorPortType">
+ <soap:binding style="rpc"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="add2">
+ <soap:operation soapAction="urn:example-org-calculator#add2"/>
+ <input>
+ <soap:body use="encoded" namespace="urn:example-org-calculator"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="urn:example-org-calculator"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+</binding>
+
+<service name="CalculatorService">
+ <port name="CalculatorPort" binding="CalculatorBinding">
+ <soap:address location="http://localhost/PHP%20Playground/SoapExtension/ComplexCalculator/calculator_server.php"/>
+ </port>
+</service>
+</definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator2a.wsdl b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator2a.wsdl new file mode 100644 index 0000000000..eb17b03db7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/calculator2a.wsdl @@ -0,0 +1,69 @@ +<?xml version ="1.0" encoding ="UTF-8" ?>
+<definitions name="Calculator"
+ targetNamespace="http://example.org/Calculator"
+ xmlns:calc="http://example.org/CalculatorTypes"
+ xmlns:tns="http://example.org/Calculator"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+
+<!-- This is how it's done with an import
+<types>
+ <xsd:schema targetNamespace="http://example.org/Calculator">
+ <import namespace="http://example.org/CalculatorTypes" schemaLocation="calculator.xsd"/>
+ </xsd:schema>
+</types>
+-->
+
+<!-- This is how it's done without an import -->
+<types>
+ <xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://example.org/Calculator">
+ <xsd:complexType name="AddArguments">
+ <xsd:sequence>
+ <xsd:element name="a" type="xsd:float"/>
+ <xsd:element name="b" type="xsd:float"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:schema>
+</types>
+
+<message name="getCalculatorRequest">
+ <part name="arguments" type="calc:AddArguments"/>
+</message>
+<message name="getCalculatorResponse">
+ <part name="result" type="xsd:float"/>
+</message>
+
+<portType name="CalculatorPortType">
+ <operation name="add2">
+ <input message="tns:getCalculatorRequest"/>
+ <output message="tns:getCalculatorResponse"/>
+ </operation>
+</portType>
+
+<binding name="CalculatorBinding" type="tns:CalculatorPortType">
+ <soap:binding style="rpc"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="add2">
+ <soap:operation soapAction="urn:example-org-calculator#add2"/>
+ <input>
+ <soap:body use="encoded" namespace="urn:example-org-calculator"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="urn:example-org-calculator"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+</binding>
+
+<service name="CalculatorService">
+ <port name="CalculatorPort" binding="CalculatorBinding">
+ <soap:address location="http://localhost/PHP%20Playground/SoapExtension/ComplexCalculator/calculator_server.php"/>
+ </port>
+</service>
+</definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/carotest3.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/carotest3.txt new file mode 100644 index 0000000000..cb5e4ed9b3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/carotest3.txt @@ -0,0 +1,36 @@ +====================================== +====================================== +====================================== +I am Item 1 of string +====================================== +====================================== +I am Item 1 of string +I am the first free text +====================================== +====================================== +I am Item 1 of string +I am the first free text +I am Item 2 of string +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string + +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string +department1 +====================================== +Element zero, length 1: 1 +Element one, length 2: 2 +Element two, length 3: 3 +Element three,length 4: 4 +Element four, length 5: 5 diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company.xsd new file mode 100644 index 0000000000..2c7769167a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company.xsd @@ -0,0 +1,46 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company_with_nillable_SN.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company_with_nillable_SN.xml new file mode 100644 index 0000000000..16a32223ab --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company_with_nillable_SN.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + + <!-- This XML has an employee with an SN of nil, which should appear in the SDO as NULL + --> + <company xmlns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="#/departments.0/employees.1"> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees> +<name>Jane Doe</name> +<SN xsi:nil="true" /> +</employees> +</departments> +</company>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company_with_nillable_SN.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company_with_nillable_SN.xsd new file mode 100644 index 0000000000..808e075a2d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/company_with_nillable_SN.xsd @@ -0,0 +1,45 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<!-- This XSD recasts the properties of employee to elements in order to allow the SN property to be nillable --> +<xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" +sdoxml:propertyType="company:EmployeeType"/> </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="SN" type="xsd:ID" nillable="true"/> + <xsd:element name="manager" type="xsd:boolean"/> + </xsd:complexType> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companyabs.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companyabs.xsd new file mode 100644 index 0000000000..f8a1577daf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companyabs.xsd @@ -0,0 +1,60 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + <xsd:element name="Publication" type="company:PublicationType" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + <xsd:complexType name="BookType"> + <xsd:restriction base="company:PublicationType" /> + <xsd:element name="author" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:complexType name="MagazineType"> + <xsd:restriction base="company:PublicationType" /> + <xsd:element name="editor" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:complexType name="PublicationType" abstract="true" > + <xsd:element name="title" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:element name="Book" type="company:BookType" substitutionGroup="Publication" /> + <xsd:element name="Magazine" type="company:MagazineType" substitutionGroup="company:Publication" /> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companyref.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companyref.xsd new file mode 100644 index 0000000000..614dca1752 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companyref.xsd @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + xmlns:company="companyNS" + targetNamespace="companyNS"> + elementFormDefault="qualified"> + + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + <xsd:element name="my.Publication" ref="publication" sdo:name="MyPublication" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + <xsd:complexType name="BookType"> + <xsd:restriction base="company:PublicationType" /> + <xsd:element name="author" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:complexType name="MagazineType"> + <xsd:restriction base="company:PublicationType" /> + <xsd:element name="editor" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:complexType name="PublicationType"> + <xsd:element name="title" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:element name="my.book" sdo:name="MyBook" type="company:BookType" substitutionGroup="Publication" /> + <xsd:element name="my.magazine" sdo:name="MyMagazine" type="company:MagazineType" substitutionGroup="company:Publication" /> + <xsd:element name="my.publication" sdo:name="MyPublication" type="company:PublicationType"/> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companysubs.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companysubs.xsd new file mode 100644 index 0000000000..f71e07dbee --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/companysubs.xsd @@ -0,0 +1,60 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + <xsd:element name="Publication" type="company:PublicationType" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + <xsd:complexType name="BookType"> + <xsd:restriction base="company:PublicationType" /> + <xsd:element name="author" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:complexType name="MagazineType"> + <xsd:restriction base="company:PublicationType" /> + <xsd:element name="editor" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:complexType name="PublicationType"> + <xsd:element name="title" type="xsd:string" maxOccurs="1"/> + </xsd:complexType> + <xsd:element name="Book" type="company:BookType" substitutionGroup="Publication" /> + <xsd:element name="Magazine" type="company:MagazineType" substitutionGroup="company:Publication" /> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload-output.txt new file mode 100644 index 0000000000..b4c0b2d911 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0004"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><create>#/departments.0/employees.2</create><delete>#/departments.0/employees.1</delete><create>#/departments.0/employees.3</create><create>#/departments.0/employees.4</create><company sdo:ref="#/" employeeOfTheMonth="" name="ACME" employeeOfTheMonth="#/departments.0/employees.1"/><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees sdo:ref="#/departments.0/employees.1"/></departments></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Jane Doe" SN="E0003"/><employees name="Al Smith" SN="E0004" manager="true"/><employees name="Bill Withers" SN="E0005"/><employees name="Mary Smith" SN="E0002" manager="true"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload-output.xml new file mode 100644 index 0000000000..b4c0b2d911 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0004"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><create>#/departments.0/employees.2</create><delete>#/departments.0/employees.1</delete><create>#/departments.0/employees.3</create><create>#/departments.0/employees.4</create><company sdo:ref="#/" employeeOfTheMonth="" name="ACME" employeeOfTheMonth="#/departments.0/employees.1"/><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees sdo:ref="#/departments.0/employees.1"/></departments></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Jane Doe" SN="E0003"/><employees name="Al Smith" SN="E0004" manager="true"/><employees name="Bill Withers" SN="E0005"/><employees name="Mary Smith" SN="E0002" manager="true"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload2-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload2-output.txt new file mode 100644 index 0000000000..82175d4d13 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload2-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0005"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.1/employees.4</delete><delete>#/departments.1/employees.3</delete><delete>#/departments.1/employees.2</delete><delete>#/departments.1/employees.1</delete><delete>#/departments.1/employees.0</delete><delete>#/departments.1</delete><create>#/departments.0/employees.2</create><company sdo:ref="#/" employeeOfTheMonth="" name="Eastleigh Borough Council"><departments sdo:ref="#/departments.0"/><departments name="Tax Collection" location="Winchester" number="666"><employees name="Arch Meanie" SN="D0001" manager="false"/><employees name="Boris the Spider" SN="D0002" manager="true"/><employees name="Cash Hoarder" SN="D0003" manager="false"/><employees name="Dean Giyatoss" SN="D0004" manager="false"/><employees name="Ebenezer Scrooge" SN="D0005" manager="false"/></departments></company><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Bridget Jones" SN="E0002" manager="true"/><employees name="Colin Thorne" SN="E0003" manager="false"/><employees name="Donald Trump" SN="E0004" manager="false"/><employees sdo:ref="#/departments.0/employees.1"/></departments></sdo:changeSummary><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Eddy the eagle" SN="E0005"/><employees name="Colin Thorne" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload2-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload2-output.xml new file mode 100644 index 0000000000..82175d4d13 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload2-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0005"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.1/employees.4</delete><delete>#/departments.1/employees.3</delete><delete>#/departments.1/employees.2</delete><delete>#/departments.1/employees.1</delete><delete>#/departments.1/employees.0</delete><delete>#/departments.1</delete><create>#/departments.0/employees.2</create><company sdo:ref="#/" employeeOfTheMonth="" name="Eastleigh Borough Council"><departments sdo:ref="#/departments.0"/><departments name="Tax Collection" location="Winchester" number="666"><employees name="Arch Meanie" SN="D0001" manager="false"/><employees name="Boris the Spider" SN="D0002" manager="true"/><employees name="Cash Hoarder" SN="D0003" manager="false"/><employees name="Dean Giyatoss" SN="D0004" manager="false"/><employees name="Ebenezer Scrooge" SN="D0005" manager="false"/></departments></company><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Bridget Jones" SN="E0002" manager="true"/><employees name="Colin Thorne" SN="E0003" manager="false"/><employees name="Donald Trump" SN="E0004" manager="false"/><employees sdo:ref="#/departments.0/employees.1"/></departments></sdo:changeSummary><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Eddy the eagle" SN="E0005"/><employees name="Colin Thorne" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload3-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload3-output.txt new file mode 100644 index 0000000000..82175d4d13 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload3-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0005"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.1/employees.4</delete><delete>#/departments.1/employees.3</delete><delete>#/departments.1/employees.2</delete><delete>#/departments.1/employees.1</delete><delete>#/departments.1/employees.0</delete><delete>#/departments.1</delete><create>#/departments.0/employees.2</create><company sdo:ref="#/" employeeOfTheMonth="" name="Eastleigh Borough Council"><departments sdo:ref="#/departments.0"/><departments name="Tax Collection" location="Winchester" number="666"><employees name="Arch Meanie" SN="D0001" manager="false"/><employees name="Boris the Spider" SN="D0002" manager="true"/><employees name="Cash Hoarder" SN="D0003" manager="false"/><employees name="Dean Giyatoss" SN="D0004" manager="false"/><employees name="Ebenezer Scrooge" SN="D0005" manager="false"/></departments></company><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Bridget Jones" SN="E0002" manager="true"/><employees name="Colin Thorne" SN="E0003" manager="false"/><employees name="Donald Trump" SN="E0004" manager="false"/><employees sdo:ref="#/departments.0/employees.1"/></departments></sdo:changeSummary><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Eddy the eagle" SN="E0005"/><employees name="Colin Thorne" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload3-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload3-output.xml new file mode 100644 index 0000000000..82175d4d13 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/csload3-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0005"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.1/employees.4</delete><delete>#/departments.1/employees.3</delete><delete>#/departments.1/employees.2</delete><delete>#/departments.1/employees.1</delete><delete>#/departments.1/employees.0</delete><delete>#/departments.1</delete><create>#/departments.0/employees.2</create><company sdo:ref="#/" employeeOfTheMonth="" name="Eastleigh Borough Council"><departments sdo:ref="#/departments.0"/><departments name="Tax Collection" location="Winchester" number="666"><employees name="Arch Meanie" SN="D0001" manager="false"/><employees name="Boris the Spider" SN="D0002" manager="true"/><employees name="Cash Hoarder" SN="D0003" manager="false"/><employees name="Dean Giyatoss" SN="D0004" manager="false"/><employees name="Ebenezer Scrooge" SN="D0005" manager="false"/></departments></company><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Bridget Jones" SN="E0002" manager="true"/><employees name="Colin Thorne" SN="E0003" manager="false"/><employees name="Donald Trump" SN="E0004" manager="false"/><employees sdo:ref="#/departments.0/employees.1"/></departments></sdo:changeSummary><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Eddy the eagle" SN="E0005"/><employees name="Colin Thorne" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave-output.txt new file mode 100644 index 0000000000..9490166774 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0004"><sdo:changeSummary xmlns:sdo="commonj.sdo"><create>#/departments.0/employees.2</create><delete>#/departments.0/employees.1</delete><create>#/departments.0/employees.3</create><create>#/departments.0/employees.4</create><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees sdo:ref="#/departments.0/employees.1"/></departments><company sdo:ref="#/" name="ACME" employeeOfTheMonth="#/departments.0/employees.1"/></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Jane Doe" SN="E0003"/><employees name="Al Smith" SN="E0004" manager="true"/><employees name="Bill Withers" SN="E0005"/><employees name="Mary Smith" SN="E0002" manager="true"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave-output.xml new file mode 100644 index 0000000000..9490166774 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0004"><sdo:changeSummary xmlns:sdo="commonj.sdo"><create>#/departments.0/employees.2</create><delete>#/departments.0/employees.1</delete><create>#/departments.0/employees.3</create><create>#/departments.0/employees.4</create><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees sdo:ref="#/departments.0/employees.1"/></departments><company sdo:ref="#/" name="ACME" employeeOfTheMonth="#/departments.0/employees.1"/></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Jane Doe" SN="E0003"/><employees name="Al Smith" SN="E0004" manager="true"/><employees name="Bill Withers" SN="E0005"/><employees name="Mary Smith" SN="E0002" manager="true"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave2-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave2-output.txt new file mode 100644 index 0000000000..cce98c2591 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave2-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0005"><sdo:changeSummary xmlns:sdo="commonj.sdo"><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.1/employees.4</delete><delete>#/departments.1/employees.3</delete><delete>#/departments.1/employees.2</delete><delete>#/departments.1/employees.1</delete><delete>#/departments.1/employees.0</delete><delete>#/departments.1</delete><create>#/departments.0/employees.2</create><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Bridget Jones" SN="E0002" manager="true"/><employees name="Colin Thorne" SN="E0003" manager="false"/><employees name="Donald Trump" SN="E0004" manager="false"/><employees sdo:ref="#/departments.0/employees.1"/></departments><company sdo:ref="#/" name="Eastleigh Borough Council" employeeOfTheMonth=""><departments sdo:ref="#/departments.0"/><departments name="Tax Collection" location="Winchester" number="666"><employees name="Arch Meanie" SN="D0001" manager="false"/><employees name="Boris the Spider" SN="D0002" manager="true"/><employees name="Cash Hoarder" SN="D0003" manager="false"/><employees name="Dean Giyatoss" SN="D0004" manager="false"/><employees name="Ebenezer Scrooge" SN="D0005" manager="false"/></departments></company></sdo:changeSummary><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Eddy the eagle" SN="E0005"/><employees name="Colin Thorne" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave2-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave2-output.xml new file mode 100644 index 0000000000..cce98c2591 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/cssave2-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="E0005"><sdo:changeSummary xmlns:sdo="commonj.sdo"><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.0/employees.1</delete><delete>#/departments.1/employees.4</delete><delete>#/departments.1/employees.3</delete><delete>#/departments.1/employees.2</delete><delete>#/departments.1/employees.1</delete><delete>#/departments.1/employees.0</delete><delete>#/departments.1</delete><create>#/departments.0/employees.2</create><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees name="Bridget Jones" SN="E0002" manager="true"/><employees name="Colin Thorne" SN="E0003" manager="false"/><employees name="Donald Trump" SN="E0004" manager="false"/><employees sdo:ref="#/departments.0/employees.1"/></departments><company sdo:ref="#/" name="Eastleigh Borough Council" employeeOfTheMonth=""><departments sdo:ref="#/departments.0"/><departments name="Tax Collection" location="Winchester" number="666"><employees name="Arch Meanie" SN="D0001" manager="false"/><employees name="Boris the Spider" SN="D0002" manager="true"/><employees name="Cash Hoarder" SN="D0003" manager="false"/><employees name="Dean Giyatoss" SN="D0004" manager="false"/><employees name="Ebenezer Scrooge" SN="D0005" manager="false"/></departments></company></sdo:changeSummary><departments name="Waste Disposal" location="Botley" number="123"><employees name="Alphonse Dodet" SN="E0001"/><employees name="Eddy the eagle" SN="E0005"/><employees name="Colin Thorne" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/datetest.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/datetest.txt new file mode 100644 index 0000000000..3da923ea55 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/datetest.txt @@ -0,0 +1,4 @@ +Name of the company is DateTest +Set start of the company is 1000 +Review number:0 was:2000 +Review number:1 was:4000 diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/defaults.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/defaults.txt new file mode 100644 index 0000000000..1cdba8ea05 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/defaults.txt @@ -0,0 +1,10 @@ +Boolean default is true: 1 +Byte default is d: 100 +Character default is e: 101 +Short default is 300: 300 +Long default is 400: 400 +Expected index out of range OK +Float default is 600: 600.000 +LongDouble default is 700: 700.000 +String default is HELP: HELP +Bytes default is HELP: HELP diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.txt new file mode 100644 index 0000000000..b08b52a605 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.txt @@ -0,0 +1,2 @@ +RootURI=companyNS +RootName=company diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.xml new file mode 100644 index 0000000000..9a865fc160 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<company targetNameSpace="hghgh" xmlns="companyNS" name="MegaCorp" employeeOfTheMonth="#/departments.0/employees.1"> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees name="John Jones" SN="E0001" /> +<employees name="Jane Doe" SN="E0003" /> +<employees name="Al Smith" SN="E0004" manager="true" /> +</departments> +</company>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.xsd new file mode 100644 index 0000000000..a507785277 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/doctest.xsd @@ -0,0 +1,44 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" +sdoxml:propertyType="company:EmployeeType"/> </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/employee.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/employee.xsd new file mode 100644 index 0000000000..d219afc522 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/employee.xsd @@ -0,0 +1,41 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +<xs:element name="employee" type="fullpersoninfo"/> + +<xs:complexType name="personinfo"> + <xs:sequence> + <xs:element name="firstname" type="xs:string"/> + <xs:element name="lastname" type="xs:string"/> + </xs:sequence> +</xs:complexType> + +<xs:complexType name="fullpersoninfo"> + <xs:complexContent> + <xs:extension base="personinfo"> + <xs:sequence> + <xs:element name="address" type="xs:string"/> + <xs:element name="city" type="xs:string"/> + <xs:element name="country" type="xs:string"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> +</xs:complexType> + +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs1.txt new file mode 100644 index 0000000000..30b469181d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs1.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME" employeeOfTheMonth="E0002"><sdo:changeSummary xmlns:sdo="commonj.sdo"/><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees name="Jane Doe" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs1.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs1.xml new file mode 100644 index 0000000000..30b469181d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs1.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME" employeeOfTheMonth="E0002"><sdo:changeSummary xmlns:sdo="commonj.sdo"/><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees name="Jane Doe" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs2.txt new file mode 100644 index 0000000000..596c51091d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs2.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME" employeeOfTheMonth="E0002"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"/><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees name="Jane Doe" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs2.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs2.xml new file mode 100644 index 0000000000..596c51091d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs2.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME" employeeOfTheMonth="E0002"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"/><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees name="Jane Doe" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs3.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs3.txt new file mode 100644 index 0000000000..14e33b7c55 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs3.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME" employeeOfTheMonth="E0002"><sdo:changeSummary xmlns:sdo="commonj.sdo"><create>#/departments.0/employees.3</create><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees sdo:ref="#/departments.0/employees.1"/><employees sdo:ref="#/departments.0/employees.2"/></departments></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees name="Jane Doe" SN="E0003"/><employees name="Al Smith" SN="E0004" manager="true"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs3.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs3.xml new file mode 100644 index 0000000000..14e33b7c55 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/emptycs3.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME" employeeOfTheMonth="E0002"><sdo:changeSummary xmlns:sdo="commonj.sdo"><create>#/departments.0/employees.3</create><departments sdo:ref="#/departments.0"><employees sdo:ref="#/departments.0/employees.0"/><employees sdo:ref="#/departments.0/employees.1"/><employees sdo:ref="#/departments.0/employees.2"/></departments></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="John Jones" SN="E0001"/><employees name="Mary Smith" SN="E0002" manager="true"/><employees name="Jane Doe" SN="E0003"/><employees name="Al Smith" SN="E0004" manager="true"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/error1.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/error1.xml new file mode 100644 index 0000000000..16a32223ab --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/error1.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + + <!-- This XML has an employee with an SN of nil, which should appear in the SDO as NULL + --> + <company xmlns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MegaCorp" employeeOfTheMonth="#/departments.0/employees.1"> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees> +<name>Jane Doe</name> +<SN xsi:nil="true" /> +</employees> +</departments> +</company>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/error1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/error1.xsd new file mode 100644 index 0000000000..ae8130189c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/error1.xsd @@ -0,0 +1,45 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<!-- This XSD recasts the properties of employee to elements in order to allow the SN property to be nillable --> +<xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" +sdoxml:propertyType="company:EmployeeType"/> </xsd:complexType> + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="EmployeeType"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="SN" type="xsd:ID" nillable="true"/> + <xsd:element name="manager" type="xsd:boolean"/> + +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/extension.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/extension.xsd new file mode 100644 index 0000000000..247380ceba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/extension.xsd @@ -0,0 +1,54 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<!-- + This example simplified version of W3C XML schema primer + with added UK postcode + http://www.w3.org/TR/xmlschema-0/#DerivExt + --> + + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="" > + + <complexType name="Address"> + <sequence> + <element name="name" type="string"/> + <element name="street" type="string"/> + <element name="city" type="string"/> + </sequence> + </complexType> + + <complexType name="USAddress"> + <complexContent> + <extension base="Address"> + <sequence> + <element name="zip" type="positiveInteger"/> + </sequence> + </extension> + </complexContent> + </complexType> + + <complexType name="UKAddress"> + <complexContent> + <extension base="Address"> + <sequence> + <element name="postcode" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gCustomer.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gCustomer.xsd new file mode 100644 index 0000000000..1671c987bf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gCustomer.xsd @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:cust="customerNS" targetNamespace="customerNS"> + <element name="customer" type="cust:CustomerType"> + <complexType name="CustomerType"> + <sequence> + <element name="customerId" type="ID"/> + <element name="name" type="string"/> + <element name="shipping" type="cust:AddressType"> + <complexType name="AddressType"> + <element name="street" type="string"/> + <element name="city" type="string"/> + <element name="state" type="string"/> + <element name="zip" type="string"/> + </complexType> + </element> + <element name="payment" ref="cust:payment"/> + </sequence> + </complexType> + </element> + + <element name="payment" type="cust:PaymentType"> + <complexType name="PaymentType"> + <element name="paymentId" type="ID"/> + <element name="accountNo" type="string"/> + <element name="bank" type="string"/> + <element name="securityCode" type="string"/> + <element name="amount" type="float"/> + </complexType> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gOrder.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gOrder.xml new file mode 100644 index 0000000000..7beea167d3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gOrder.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<order xmlns="orderNS" xsi:type="OrderType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><orderId>1132323800</orderId><status>NONE</status><item><itemId>12</itemId><description>Drummers drumming</description><price>12.99</price><quantity>1</quantity><warehouseId>1</warehouseId></item><item><itemId>3</itemId><description>French Hens</description><price>3.99</price><quantity>2</quantity><warehouseId>1</warehouseId></item><customer xmlns="customerNS"><customerId>1</customerId><name>Graham Charters</name><shipping><street>24 Big Street</street><city>Big City</city><state>Big State</state><zip>Up Your Coat</zip></shipping><payment><accountNo>234234234243</accountNo><bank>Big</bank><securityCode>234</securityCode><amount>2.097e+001</amount></payment></customer></order> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gOrder.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gOrder.xsd new file mode 100644 index 0000000000..d4e0ff832e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g/gOrder.xsd @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" +xmlns:ord="orderNS" xmlns:cust="customerNS" targetNamespace="orderNS"> + + <include schemaLocation="./Customer.xsd"/> + + <element name="order" type="ord:OrderType"> + <complexType name="OrderType"> + <sequence> + <element name="orderId" type="ID"/> + <element name="status" type="ord:OrderStatus"/> + <element name="item" maxOccurs="unbounded" ref="ord:item"/> + <element ref="cust:customer"/> + </sequence> + </complexType> + </element> + + <element name="item"> + <complexType> + <element name="itemId" type="integer"/> + <element name="description" type="string"/> + <element name="price" type="string"/> + <element name="quantity" type="integer"/> + <element name="warehouseId" type="integer"/> + </complexType> + </element> + + <simpleType name="OrderStatus"> + <restriction base="string"> + <enumeration value="NONE"/> + <enumeration value="RECEIVED"/> + <enumeration value="INVOICED"/> + <enumeration value="DISPATCHED"/> + <enumeration value="COMPLETED"/> + <enumeration value="CANCELLED"/> + </restriction> + </simpleType> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g3.xsd new file mode 100644 index 0000000000..c70d00aa43 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/g3.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> + <xs:element name="quotes"> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="quote"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="quote"> + <xs:complexType> + <xs:sequence> + <xs:element ref="phrase"/> + <xs:element ref="author"/> + </xs:sequence> + <xs:attribute name="year" use="required" type="xs:integer"/> + </xs:complexType> + </xs:element> + <xs:element name="phrase" type="xs:string"/> + <xs:element name="author" type="xs:string"/> +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/getproptest.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/getproptest.txt new file mode 100644 index 0000000000..f6bea1325d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/getproptest.txt @@ -0,0 +1,8 @@ +Companys name property is: name +Companys dept property is:departments +Departments empl property is:employees +Departments empl property is:employees +Employees name property is:name +Normal exception caught +Normal exception caught +Normal exception caught diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham1.xsd new file mode 100644 index 0000000000..dbab303cd7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham1.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> + <xs:element name="quotes"> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="quote"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="quote"> + <xs:complexType> + <xs:sequence> + <xs:element ref="phrase"/> + <xs:element ref="author"/> + </xs:sequence> + <xs:attribute name="year" use="required" type="xs:integer"/> + </xs:complexType> + </xs:element> + <xs:element name="phrase" type="xs:string"/> + <xs:element name="author" type="xs:string"/> +</xs:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham2.xsd new file mode 100644 index 0000000000..6c8f68beb7 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham2.xsd @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" +xmlns:quotes="quotesNS" targetNamespace="quotesNS"> +<xs:element name="quotes"> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="quote"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="quote" > + <xs:complexType> + <xs:sequence> + <xs:element name="phrase" type="xs:string"/> + <xs:element name="author" type="xs:string"/> + </xs:sequence> + <xs:attribute name="year" use="required" type="xs:integer"/> + </xs:complexType> + </xs:element> +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham3.xsd new file mode 100644 index 0000000000..9123233b43 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/graham3.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" +> +<!-- +xmlns:quotes="quotesNS" targetNamespace="quotesNS" +--> +<xs:element name="quotes"> + <xs:complexType> + <xs:sequence> + <xs:element name="quote" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="phrase" type="xs:string"/> + <xs:element name="author" type="xs:string"/> + </xs:sequence> + <xs:attribute name="year" use="required" type="xs:integer"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> +</xs:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupingroup.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupingroup.xsd new file mode 100644 index 0000000000..dd13042e8a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupingroup.xsd @@ -0,0 +1,42 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + <group name="NameGroup2"> + <sequence> + <element name="first2" type="string"/> + <element name="middle2" type="string"/> + <element name="last2" type="string"/> + </sequence> + </group> + </sequence> + </group> + <element name="name"> + <complexType> + <group ref="NameGroup"/> + <group ref="NameGroup2"/> + <attribute name="title" type="string"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupingroup_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupingroup_xsd.txt new file mode 100644 index 0000000000..7eba22a274 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupingroup_xsd.txt @@ -0,0 +1,25 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouprefingroup.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouprefingroup.xsd new file mode 100644 index 0000000000..d10195a4fd --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouprefingroup.xsd @@ -0,0 +1,42 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NameGroup2"> + <sequence> + <element name="first2" type="string"/> + <element name="middle2" type="string"/> + <element name="last2" type="string"/> + </sequence> + </group> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + <group ref="target:NameGroup2"/> + </sequence> + </group> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouprefingroup_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouprefingroup_xsd.txt new file mode 100644 index 0000000000..f879c8adb2 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouprefingroup_xsd.txt @@ -0,0 +1,29 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:first2 of type String +Property:middle2 of type String +Property:last2 of type String +Property:title of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouptoolate.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouptoolate.xsd new file mode 100644 index 0000000000..3274282966 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouptoolate.xsd @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + </complexType> + </element> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + </group> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouptoolate_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouptoolate_xsd.txt new file mode 100644 index 0000000000..81ccaee474 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/grouptoolate_xsd.txt @@ -0,0 +1,26 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwithprefix.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwithprefix.xsd new file mode 100644 index 0000000000..a2f5c5fd49 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwithprefix.xsd @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + </group> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwithprefix_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwithprefix_xsd.txt new file mode 100644 index 0000000000..81ccaee474 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwithprefix_xsd.txt @@ -0,0 +1,26 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:name of type name +Type:http://www.wrox.com/name#name +Property:first of type String +Property:middle of type String +Property:last of type String +Property:title of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwrongname.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwrongname.xsd new file mode 100644 index 0000000000..c30bc45421 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/groupwrongname.xsd @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.wrox.com/name" +xmlns:target="http://www.wrox.com/name" elementFormDefault="qualified"> + <group name="NoNameGroup"> + <sequence> + <element name="first" type="string"/> + <element name="middle" type="string"/> + <element name="last" type="string"/> + </sequence> + </group> + <element name="name"> + <complexType> + <group ref="target:NameGroup"/> + <attribute name="title" type="string"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/inc1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/inc1.txt new file mode 100644 index 0000000000..bf517ec394 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/inc1.txt @@ -0,0 +1,22 @@ +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://example.org/Calculator#RootType +Type:http://example.org/CalculatorTypes#AddArguments +Property:a +Property:b +Type:http://example.org/CalculatorTypes#RootType diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/inc2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/inc2.txt new file mode 100644 index 0000000000..ac4a97479f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/inc2.txt @@ -0,0 +1,21 @@ +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://example.org/Calculator#AddArguments +Property:a +Property:b +Type:http://example.org/Calculator#RootType diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include.xsd new file mode 100644 index 0000000000..8e89ef40ec --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:include schemaLocation = "include1.xsd"/> + <xsd:include schemaLocation = "./include2.xsd"/> + <xsd:include schemaLocation = "../test/test/include3.xsd"/> + + + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include1.xsd new file mode 100644 index 0000000000..65f71c48a6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include1.xsd @@ -0,0 +1,34 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include2.xsd new file mode 100644 index 0000000000..329fd17761 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/include2.xsd @@ -0,0 +1,33 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/includeother3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/includeother3.xsd new file mode 100644 index 0000000000..b6ec93f0ba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/includeother3.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1.xml new file mode 100644 index 0000000000..449a9e8b8b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1.xml @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<listtest + xmlns="http://www.wrox.com/name" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" + xsi:schemaLocation="http://www.wrox.com/name name.xsd"> + <integers>1 2 3 4 5 6 7 8 9</integers> + <strings> + This +is a strange + set of strings + </strings> +</listtest> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1.xsd new file mode 100644 index 0000000000..c702cb47c8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1.xsd @@ -0,0 +1,36 @@ +<?xml version="1.0"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.wrox.com/name" + xmlns:tns="http://www.wrox.com/name"> + +<xs:element name="listtest" type="listTestType"/> +<xs:complexType name="listTestType"> + <xs:element name="integers" type="intListType"/> + <xs:element name="strings" type="stringListType"/> +</xs:complexType> + +<xs:simpleType name="intListType"> + <xs:list itemType="xs:integer"/> +</xs:simpleType> + +<xs:simpleType name="stringListType"> + <xs:list itemType="xs:string"/> +</xs:simpleType> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1_xml.txt new file mode 100644 index 0000000000..ddf8e8ac22 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1_xml.txt @@ -0,0 +1,70 @@ +***** TYPES AFTER RESOLVE********************************* +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:listtest of type listTestType +Type:http://www.wrox.com/name#intListType +Property:values (many) of type Integer +Type:http://www.wrox.com/name#listTestType +Property:integers (many) of type intListType +Property:strings (many) of type stringListType +Type:http://www.wrox.com/name#stringListType +Property:values (many) of type String +*******************************END TYPES****************** +===== DataObject contents ===== +integers: list dataObject[0]= +===== DataObject contents ===== +values: list integer[0]=1 + +integer[1]=2 + +integer[2]=3 + +integer[3]=4 + +integer[4]=5 + +integer[5]=6 + +integer[6]=7 + +integer[7]=8 + +integer[8]=9 + +===== End DataObject ===== + +strings: list dataObject[0]= +===== DataObject contents ===== +values: list string[0]=This + +string[1]=is + +string[2]=a + +string[3]=strange + +string[4]=set + +string[5]=of + +string[6]=strings + +===== End DataObject ===== + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1_xsd.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1_xsd.txt new file mode 100644 index 0000000000..2adeaf3a7c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/list1_xsd.txt @@ -0,0 +1,28 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://www.wrox.com/name#RootType +Property:listtest of type listTestType +Type:http://www.wrox.com/name#intListType +Property:values (many) of type Integer +Type:http://www.wrox.com/name#listTestType +Property:integers (many) of type intListType +Property:strings (many) of type stringListType +Type:http://www.wrox.com/name#stringListType +Property:values (many) of type String +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/loadload-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/loadload-output.txt new file mode 100644 index 0000000000..a6df48b1be --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/loadload-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><create>#/departments.0/employees.0/opendataobjectlist.0</create><create>#/departments.0/employees.0/opendataobject</create><create>#/departments.0/employees.0</create></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"><openintlist>45</openintlist><opendataobjectlist xsi:type="OpenType" name="MyOpenName"/><opendataobject xsi:type="OpenType" name="MyOpenName"/></employees><employees name="Boris" SN="E0002" manager="true"/><employees name="Carl" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/loadload-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/loadload-output.xml new file mode 100644 index 0000000000..a6df48b1be --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/loadload-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><create>#/departments.0/employees.0/opendataobjectlist.0</create><create>#/departments.0/employees.0/opendataobject</create><create>#/departments.0/employees.0</create></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"><openintlist>45</openintlist><opendataobjectlist xsi:type="OpenType" name="MyOpenName"/><opendataobject xsi:type="OpenType" name="MyOpenName"/></employees><employees name="Boris" SN="E0002" manager="true"/><employees name="Carl" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/main.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/main.cpp new file mode 100644 index 0000000000..b95587b7f3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/main.cpp @@ -0,0 +1,175 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: main.cpp,v 1.1 2006/03/16 10:54:16 slattery Exp $ */ + +#include <stdio.h> + +#pragma warning(disable:4786) + +#include <iostream> +using namespace std; + +#include "sdotest.h" + +extern "C"{ + +#define TEST(testname)\ + value = testname;\ + if (value == 0) {\ + cout << "Test Failed:" << totaltests << endl;\ + }\ + testspassed += value;\ + totaltests++; + +int main (int argc, char** argv) +{ + //Logger::setLogging(20); + + int testspassed=0; + int totaltests=0; + int value = 0; + + /* TEST ( sdotest::xhtml1() ); */ + TEST ( sdotest::scopetest() ); + TEST ( sdotest::xsdtosdo() ); + + /* groups now supported*/ + TEST ( sdotest::testany("list1.xsd",0,"list1.xml", 0) ); + TEST ( sdotest::testany("b48636.xsd",0,"b48636.xml", 0) ); + TEST ( sdotest::testany("groupwithprefix.xsd", 0, 0, 0) ); + TEST ( sdotest::testany("groupwrongname.xsd","Use of undefined group NameGroup", 0, 0) ); + + // late definition of group now supported + TEST ( sdotest::testany("grouptoolate.xsd",0 , 0, 0) ); + + // group definition within group now ignored + + TEST ( sdotest::testany("groupingroup.xsd","Use of undefined group NameGroup2",0, 0) ); + TEST ( sdotest::testany("grouprefingroup.xsd",0,0, 0) ); + TEST ( sdotest::testany("bothgroups.xsd",0,0, 0) ); + TEST ( sdotest::testany("bothgroupssamename.xsd",0,0, 0) ); + + /* general tests */ + TEST ( sdotest::pete() ); + TEST ( sdotest::stocktest() ); + TEST ( sdotest::definetest() ); + TEST ( sdotest::emptycs() ); + TEST ( sdotest::openseq() ); + TEST ( sdotest::testanytwo("b48633b.xsd","b48633.xsd","b48633.xml") ); + TEST ( sdotest::testany("b48686.xsd",0, "b48686.xml", 0) ); + TEST ( sdotest::testany("b48636.xsd","Use of undefined group NameGroup","b48636.xml", 0) ); + TEST ( sdotest::b48602() ); + TEST ( sdotest::compatiblefactory() ); + TEST ( sdotest::simple() ); + TEST ( sdotest::testOrder("employee.xsd","extension.xsd","order1.dat","order1.txt") ); + TEST ( sdotest::testOrder("extension.xsd","employee.xsd","order2.dat","order2.txt") ); + TEST ( sdotest::testOpen() ); + TEST ( sdotest::testinc2("calculator2.wsdl","inc1.dat","inc1.txt") ); + TEST ( sdotest::testinc2("calculator2a.wsdl","inc2.dat","inc2.txt") ); + TEST ( sdotest::teststyles() ); + TEST ( sdotest::badelement() ); + TEST ( sdotest::oddchars() ); + TEST ( sdotest::notns() ); + TEST ( sdotest::unsetlist() ); + TEST ( sdotest::travel() ); + /*TEST ( sdotest::testwsdl() );*/ + TEST ( sdotest::bunique() ); + TEST ( sdotest::buniqueread() ); + TEST ( sdotest::propdefaulttest() ); + TEST ( sdotest::graham5() ); + TEST ( sdotest::graham4() ); + TEST ( sdotest::detachtest() ); + TEST ( sdotest::includetest() ); + TEST ( sdotest::testLoad() ); + TEST ( sdotest::leak() ); + TEST ( sdotest::twolists() ); + TEST ( sdotest::testUtil() ); + TEST ( sdotest::clonetest() ); + TEST ( sdotest::notfound() ); + TEST ( sdotest::testErrors() ); + TEST ( sdotest::loadManyOpen() ); + TEST ( sdotest::doctest() ); + TEST ( sdotest::graham3() ); + TEST ( sdotest::graham1() ); + TEST ( sdotest::graham2() ); + TEST ( sdotest::merle1() ); + TEST ( sdotest::loadOpenNS() ); + TEST ( sdotest::saveOpen() ); + TEST ( sdotest::loadOpen() ); + TEST ( sdotest::testui() ); + TEST ( sdotest::testSCA() ); + TEST ( sdotest::testabstract() ); + TEST ( sdotest::testsubsload() ); + TEST ( sdotest::testsubs() ); + TEST ( sdotest::setnull() ); + TEST ( sdotest::bug2() ); + TEST ( sdotest::cssave2() ); + TEST ( sdotest::csload2() ); + TEST ( sdotest::cssave() ); + TEST ( sdotest::csload() ); + TEST ( sdotest::bug1() ); + TEST ( sdotest::eqhelpertest() ); + TEST ( sdotest::cohelpertest() ); + TEST ( sdotest::datetest() ); + TEST ( sdotest::carotest3() ); + TEST ( sdotest::matttest1() ); + TEST ( sdotest::adddeletetest() ); + TEST ( sdotest::carotest2() ); + TEST ( sdotest::carotest() ); + TEST ( sdotest::setmany() ); + TEST ( sdotest::noncontest() ); + TEST ( sdotest::versiontest() ); + TEST ( sdotest::defaulttest() ); + TEST ( sdotest::defaulttest_strobj() ); + TEST ( sdotest::nulltest() ); + TEST ( sdotest::usertest() ); + TEST ( sdotest::querytest() ); + TEST ( sdotest::getproptest() ); + TEST ( sdotest::rcptest() ); + TEST ( sdotest::seqtest() ); + TEST ( sdotest::changesummarytest() ); + TEST ( sdotest::conversiontest() ); + TEST ( sdotest::boolbug() ); + TEST ( sdotest::scope1() ); + TEST ( sdotest::scope2() ); + TEST ( sdotest::scope3() ); + TEST ( sdotest::maintest() ); + + /* regression tests */ + TEST ( sdotest::b48736() ); + /*TEST ( sdotest::b48601() );*/ + TEST ( sdotest::b47293() ); + TEST ( sdotest::b48300() ); + TEST ( sdotest::b47663() ); + TEST ( sdotest::b47802() ); + TEST ( sdotest::b47137() ); + TEST ( sdotest::b47137b() ); + TEST ( sdotest::b46633() ); + TEST ( sdotest::b46693() ); + /* TEST ( sdotest::b46734() ); */ + TEST ( sdotest::b46634() ); + TEST ( sdotest::b46617b() ); + TEST ( sdotest::b46617() ); + TEST ( sdotest::b46613() ); + TEST ( sdotest::b45933() ); + + cout << "Total tests:" << totaltests << " Tests passed:" << testspassed << endl; + +return 0; +} +} diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/maintest.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/maintest.txt new file mode 100644 index 0000000000..860a763eb5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/maintest.txt @@ -0,0 +1,188 @@ +Test Program starting to create types ... +Manager is sequenced?1 +Manager is sequenced?1 +Manager is sequenced?1 +Manager is sequenced?1 +Manager is sequenced?1 +Manager is sequenced?1 +Manager is sequenced?1 +Should be Company :Company +Should be 3: 3 +Alias: TheFirm +Alias: TheBigFirm +Alias: TheLittleFirm +Manager is sequenced?1 +BEFORE RESOLUTION +Printing Types +Type BigDecimal +Type BigInteger +Type Boolean +Type Byte +Type Bytes +Type ChangeSummary +Type Character +Type DataObject +Type Date +Type Double +Type Float +Type Integer +Type Long +Type OpenDataObject +Type Short +Type String +Type URI +Type Company +Has Property name of type String +Has Property address of type String +Has Property departments of type Department +Has Property employee of the month of type Employee +Has Property floatlist of type Float +Has Property pdg of type Manager +Has Property shareholder of type Person +Has Property substring of type DerivedString +Has Property subdepartments of type SubDepartment +Type Department +Has Property name of type String +Has Property id of type Integer +Has Property manager of type Manager +Has Property employees of type Employee +Type DerivedString +Type Employee +Has Property name of type String +Has Property cubelocation of type String +Type Manager +Has Property name of type String +Has Property officeid of type String +Has Property string of type String +Has Property boolean of type Boolean +Has Property byte of type Byte +Has Property character of type Character +Has Property short of type Short +Has Property long of type Integer +Has Property longlong of type Long +Has Property float of type Float +Has Property longdouble of type Double +Has Property date of type Date +Has Property string of type String +Has Property bytes of type Bytes +Type Person +Has Property haircolour of type String +Has Property name of type String +Type SubDepartment +Has Property subname of type String +AFTER RESOLUTION +Printing Types +Type BigDecimal +Type BigInteger +Type Boolean +Type Byte +Type Bytes +Type ChangeSummary +Type Character +Type DataObject +Type Date +Type Double +Type Float +Type Integer +Type Long +Type OpenDataObject +Type Short +Type String +Type URI +Type Company +Has Property name of type String +Has Property address of type String +Has Property departments of type Department +Has Property employee of the month of type Employee +Has Property floatlist of type Float +Has Property pdg of type Manager +Has Property shareholder of type Person +Has Property substring of type DerivedString +Has Property subdepartments of type SubDepartment +Type Department +Has Property name of type String +Has Property id of type Integer +Has Property manager of type Manager +Has Property employees of type Employee +Type DerivedString +Type Employee +Has Property haircolour of type String +Has Property name of type String +Has Property name of type String +Has Property cubelocation of type String +Type Manager +Has Property haircolour of type String +Has Property name of type String +Has Property name of type String +Has Property officeid of type String +Has Property string of type String +Has Property boolean of type Boolean +Has Property byte of type Byte +Has Property character of type Character +Has Property short of type Short +Has Property long of type Integer +Has Property longlong of type Long +Has Property float of type Float +Has Property longdouble of type Double +Has Property date of type Date +Has Property string of type String +Has Property bytes of type Bytes +Type Person +Has Property haircolour of type String +Has Property name of type String +Type SubDepartment +Has Property name of type String +Has Property id of type Integer +Has Property manager of type Manager +Has Property employees of type Employee +Has Property subname of type String +Manager is sequenced?1 +This is the sub string - its primitive, but not a string +acmecorp +acmecorp +Expected default boolean (false) : false +Expected boolean (true) : true +Expected default string (0) : Now able to set + - should say now able to set + + Name from deleted item: Now able to set +0xffffffffffffffff = : -1 +0x7fffffffffffffff = 9223372036854775807 +0x7fffffff = 2147483647 +0x80000000 = 2147483648 + Expected Wide - got : Wide + Expected Thin - got : Thin +Expecting string, got Wide +Expected bool true, got 1 +Expected char 23, got 23 +expected wchar 45, got 45Expected short 34, got 34 +Expected long 56 , got 56 +Expected long long 78, got 78 +Expected long double 89, got 89.000 +Expected float 90, got 90.000 +Expected time_t 200, got 200 +Wide[0]=87 +Wide[1]=105 +Wide[2]=100 +Wide[3]=101 +Thin[0]=84 +Thin[1]=104 +Thin[2]=105 +Thin[3]=110 +1.400567.700Should be Bill:Bill +Should be Bill:Bill +The employee of the month is Bill +Now able to set +pdg correctly identified +Now able to set +size of list 5 +Research And Development +Research And Development +Department: Research And Development +Department: Marketing +Department: Architecture +Department: Pyrotechnics +Department: Accounts +Normal expected exception +Normal Invalid path exception +Normal SDOPropertyNotFound exception diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/many.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/many.xml new file mode 100644 index 0000000000..15be354bf3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/many.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"> +<sdo:changeSummary xmlns:sdo="commonj.sdo"> +<create>#/departments.0/employees.0</create> +</sdo:changeSummary> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees name="Albert" SN="E0001" > +<openlist>Three member</openlist> +<openlist>Open bytes</openlist> +<openlist>List is complete</openlist> +</employees><employees name="Boris" SN="E0002" manager="true"/> +<employees name="Carl" SN="E0003"/> +</departments> +</company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/many.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/many.xsd new file mode 100644 index 0000000000..40243b7b8d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/many.xsd @@ -0,0 +1,17 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns="companyNS" targetNamespace="companyNS"><xsd:element name="companyType" type="tns:CompanyType"/><xsd:complexType name="CompanyType" sdo:aliasName="TheFirm TheBigFirm"><xsd:sequence><xsd:element name="departments" type="tns:DepartmentType" minOccurs="0" maxOccurs="unbounded" sdo:aliasName="TheDepartments MYDepartments"/></xsd:sequence><xsd:element name="changeSummary" type="sdo:ChangeSummaryType"/><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="employeeOfTheMonth" sdoxml:propertyType="tns:EmployeeType" type="xsd:anyURI"/></xsd:complexType><xsd:element name="departmentType" type="tns:DepartmentType"/><xsd:complexType name="DepartmentType"><xsd:sequence><xsd:element name="employees" type="tns:EmployeeType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="location" type="xsd:String"/><xsd:attribute name="number" type="xsd:String"/></xsd:complexType><xsd:element name="employeeType" type="tns:EmployeeType"/><xsd:complexType name="EmployeeType"><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="SN" type="xsd:String"/><xsd:attribute name="manager" type="xsd:boolean"/><xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/><xsd:anyAttribute namespace="##any" processContents="lax"/></xsd:complexType><xsd:element name="openType" type="tns:OpenType"/><xsd:complexType name="OpenType"><xsd:attribute name="name" type="xsd:String"/></xsd:complexType></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/matttest1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/matttest1.txt new file mode 100644 index 0000000000..5c5200ff22 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/matttest1.txt @@ -0,0 +1,2 @@ +Container of Billy should be dept1, and is :Shoe +Container of Billy should be dept2, and is :IT diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/merle1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/merle1.txt new file mode 100644 index 0000000000..f0eae645b6 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/merle1.txt @@ -0,0 +1,10 @@ +<SubscriptionId>I am the subscription ID string</SubscriptionId> +<AssociateTag>I am the associate Tag string</AssociateTag> +<XMLEscaping>I am the XML escaping string</XMLEscaping> +<Validate>I am the Validate string</Validate> +DataObject "Shared" as XML: +<Shared xmlns="axis" xsi:type="ItemSearchRequest" xmlns:tns="axis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Keywords>SharedKeywordsString</Keywords><SearchIndex>SearchIndexString</SearchIndex></Shared> + +DataObject "Request" as XML: +<Request xmlns="axis" xsi:type="ItemSearchRequest" xmlns:tns="axis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Keywords>RequestKeywords</Keywords><SearchIndex>RequestSearchIndex</SearchIndex></Request> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my-core.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my-core.xsd new file mode 100644 index 0000000000..9bc25a10fb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my-core.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + + + <complexType name="Component"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:implementation"/> + </sequence> + </complexType> + + <element name="implementation" type="sca:Implementation"/> + <complexType name="Implementation"/> + + + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my-implementation-local-java.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my-implementation-local-java.xsd new file mode 100644 index 0000000000..a31c3f6593 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my-implementation-local-java.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="my-core.xsd"/> + + <element name="implementation.local.java" type="sca:LocalJavaImplementation" substitutionGroup="sca:implementation" sdo:name="implementationLocalJava"/> + <complexType name="LocalJavaImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <attribute name="scope" type="sca:Scope" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my.xsd new file mode 100644 index 0000000000..9d39e03f47 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/my.xsd @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/"> + + <include schemaLocation="my-core.xsd"/> + + <include schemaLocation="my-implementation-local-java.xsd"/> + + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/notns.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/notns.txt new file mode 100644 index 0000000000..a6f2bc0411 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/notns.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root xsi:type="Root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><list/><list/><list/></root> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/notns.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/notns.xml new file mode 100644 index 0000000000..a6f2bc0411 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/notns.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root xsi:type="Root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><list/><list/><list/></root> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/nulltest.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/nulltest.txt new file mode 100644 index 0000000000..01442ec949 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/nulltest.txt @@ -0,0 +1,91 @@ +Initially - all properties unset, and default values... +boolean set:0 value false +byte set:0 value 0 +character set:0 value 0 +short set:0 value 0 +long set:0 value 0 +longlong set:0 value +float set:0 value +longdouble set:0 value +date set:0 value +string set:0 value +bytes set:0 value +object set: 0 value: is empty +Should now have all properties set, and zero values... +boolean set:1 value:false +byte set:1 value:0 +character set:1 value:0 +short set:1 value:0 +long set:1 value:0 +longlong set:1 value:0 +float set:1 value:0.000e+000 +longdouble set:1 value:0.000e+000 +date set:1 value:0 +string set:1 value: +bytes set:1 value: +object set:1 dataobject +Should be back to having properties unset, and default values... +boolean set:0 value:false +byte set:0 value:0 +character set:0 value:0 +short set:0 value:0 +long set:0 value:0 +longlong set:0 value: +float set:0 value: +longdouble set:0 value: +date set:0 value: +string set:0 value: +bytes set:0 value: +object set: 0 dataobject is empty +boolean set:1 value:false +byte set:1 value:0 +character set:1 value:0 +short set:1 value:0 +long set:1 value:0 +longlong set:1 value:0 +float set:1 value:0.000e+000 +longdouble set:1 value:0.000e+000 +date set:0 value: +string set:1 value: +bytes set:1 value: +object set:1 dataobject is empty +Modified dataobject +Should all be null, and default values... +boolean isNull:1 set:1 value: +byte isNull:1 set:1 value: +character isNull:1 set:1 value: +short isNull:1 set:1 value: +long isNull:1 set:1 value: +longlong isNull:1 set:1 value: +float isNull:1 set:1 value: +longdouble isNull:1 set:1 value: +date isNull:1 set:1 value: +string isNull:1 set:1 value: +bytes isNull:1 set:1 value: +object isNull:1 set:1 value empty +Should all have values, and not be null.. +boolean isNull:0 set:1 value:true +byte isNull:0 set:1 value:1 +character isNull:0 set:1 value:1 +short isNull:0 set:1 value:1 +long isNull:0 set:1 value:1 +longlong isNull:0 set:1 value:1 +float isNull:0 set:1 value:1.000e+000 +longdouble isNull:0 set:1 value:1.000e+000 +date isNull:1 set:1 value: +string isNull:0 set:1 value:hello +bytes isNull:0 set:1 value:hello +object isNull0 set:1 value: dataobject +Should all be null, and default values... +boolean isNull:1 set:1 value: +byte isNull:1 set:1 value: +character isNull:1 set:1 value: +short isNull:1 set:1 value: +long isNull:1 set:1 value: +longlong isNull:1 set:1 value: +float isNull:1 set:1 value: +longdouble isNull:1 set:1 value: +date isNull:1 set:1 value: +string isNull:1 set:1 value: +bytes isNull:1 set:1 value: +object isNull;1 set:1 value: empty diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/oddchars.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/oddchars.txt new file mode 100644 index 0000000000..b9ed9643b3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/oddchars.txt @@ -0,0 +1,22 @@ +===== DataObject contents ===== +Flight: list dataObject[0]= +===== DataObject contents ===== +Departure:string:ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╔╩╦╠═╬¤ðÐÊËÈıÍÎÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ + +Arrival:string:Pound:£ Dollar:$ Euro:Ç or █ + +flightNo:string:BA243 + +===== End DataObject ===== + +Hotel: list (empty) +Excursion:dataObject + - null or unset + +Client:dataObject + - null or unset + +Party:dataObject + - null or unset + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS.xml new file mode 100644 index 0000000000..b0b7bc638f --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tp="teapot" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"> +<sdo:changeSummary xmlns:sdo="commonj.sdo"> +<create>#/departments.0/employees.0</create> +</sdo:changeSummary> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees name="Albert" SN="E0001" tp:openstring="Value Of Open String" tp:openboolean="true"> +<tp:openintlist>45</tp:openintlist> +</employees> +<employees name="Boris" SN="E0002" manager="true"/> +<employees name="Carl" SN="E0003"/> +</departments> +</company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS.xsd new file mode 100644 index 0000000000..5d39e6488d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS.xsd @@ -0,0 +1,49 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" +xmlns:tns="companyNS" targetNamespace="companyNS"> +<xsd:element name="companyType" type="tns:CompanyType"/> +<xsd:complexType name="CompanyType" sdo:aliasName="TheFirm TheBigFirm"> +<xsd:sequence> +<xsd:element name="departments" type="tns:DepartmentType" minOccurs="0" maxOccurs="unbounded" sdo:aliasName="TheDepartments MYDepartments"/> +</xsd:sequence> +<xsd:element name="changeSummary" type="sdo:ChangeSummaryType"/> +<xsd:attribute name="name" type="xsd:String"/> +<xsd:attribute name="employeeOfTheMonth" sdoxml:propertyType="tns:EmployeeType" type="xsd:anyURI"/> +</xsd:complexType><xsd:element name="departmentType" type="tns:DepartmentType"/> +<xsd:complexType name="DepartmentType"> +<xsd:sequence> +<xsd:element name="employees" type="tns:EmployeeType" minOccurs="0" maxOccurs="unbounded"/> +</xsd:sequence> +<xsd:attribute name="name" type="xsd:String"/> +<xsd:attribute name="location" type="xsd:String"/> +<xsd:attribute name="number" type="xsd:String"/> +</xsd:complexType> +<xsd:element name="employeeType" type="tns:EmployeeType"/> +<xsd:complexType name="EmployeeType"> +<xsd:attribute name="name" type="xsd:String"/> +<xsd:attribute name="SN" type="xsd:String"/> +<xsd:attribute name="manager" type="xsd:boolean"/> +<xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> +<xsd:anyAttribute namespace="##any" processContents="lax"/> +</xsd:complexType> +<xsd:element name="openType" type="tns:OpenType"/> +<xsd:complexType name="OpenType"> +<xsd:attribute name="name" type="xsd:String"/> +</xsd:complexType> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS2.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS2.xml new file mode 100644 index 0000000000..16670a8b65 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS2.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tp="twilbur" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"> +<sdo:changeSummary xmlns:sdo="commonj.sdo"> +<create>#/departments.0/employees.0</create> +</sdo:changeSummary> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees name="Albert" SN="E0001" tp:openstring="Value Of Open String" tp:openboolean="true"> +<tp:openintlist>45</tp:openintlist> +</employees> +<employees name="Boris" SN="E0002" manager="true"/> +<employees name="Carl" SN="E0003"/> +</departments> +</company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS2.xsd new file mode 100644 index 0000000000..34f5fd05ff --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNS2.xsd @@ -0,0 +1,24 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" +xmlns:tns="teapot" targetNamespace="teapot"> +<xsd:attribute name="openboolean" type="xsd:boolean"/> +<xsd:element name="openintlist" type="xsd:short" minOccurs="0" maxOccurs="unbounded"/> +<xsd:attribute name="openstring" type="xsd:hexBinary"/> +</xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNSout.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNSout.txt new file mode 100644 index 0000000000..742842bd3e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNSout.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><create>#/departments.0/employees.0</create></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"><openintlist>45</openintlist></employees><employees name="Boris" SN="E0002" manager="true"/><employees name="Carl" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNSout.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNSout.xml new file mode 100644 index 0000000000..742842bd3e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openloadNSout.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"><sdo:changeSummary xmlns:sdo="commonj.sdo" logging="true"><create>#/departments.0/employees.0</create></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"><openintlist>45</openintlist></employees><employees name="Boris" SN="E0002" manager="true"/><employees name="Carl" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openseq.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openseq.txt new file mode 100644 index 0000000000..44091f2608 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/openseq.txt @@ -0,0 +1,3 @@ +Open Type string value: Value Of Open String +Open Sequenced string value: Value of sequenced string +Open Sequenced string value from seq: Value of sequenced string diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/order1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/order1.txt new file mode 100644 index 0000000000..4f46cbfecf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/order1.txt @@ -0,0 +1,19 @@ +Type:#Address +Property:name +Property:street +Property:city +Type:#RootType +Property:employee +Type:#UKAddress +Property:value +Property:postcode +Type:#USAddress +Property:value +Property:zip +Type:#fullpersoninfo +Property:address +Property:city +Property:country +Type:#personinfo +Property:firstname +Property:lastname diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/order2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/order2.txt new file mode 100644 index 0000000000..ec01027ebb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/order2.txt @@ -0,0 +1,20 @@ +Type:#Address +Property:name +Property:street +Property:city +Type:#RootType +Property:employee +Type:#UKAddress +Property:value +Property:postcode +Type:#USAddress +Property:value +Property:zip +Type:#fullpersoninfo +Property:value +Property:address +Property:city +Property:country +Type:#personinfo +Property:firstname +Property:lastname diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/partial.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/partial.xml new file mode 100644 index 0000000000..e6f51e20f0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/partial.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"> +<sdo:changeSummary xmlns:sdo="commonj.sdo"> +<create>#/departments.0/employees.0</create> +</sdo:changeSummary> +<departments name="Advanced Technologies" location="NY" number="123"> +<employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"> +<openintlist>45</openintlist> +<opendataobjectlist xmlns="companyNS" xsi:type="OpenType" name="MyOpenName"/> +<opendataobject xsi:type="OpenType" name="MyOpenName"/> +</employees><employees name="Boris" SN="E0002" manager="true"/> +<employees name="Carl" SN="E0003"/> +</departments> +</company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/pete.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/pete.xml new file mode 100644 index 0000000000..1ed7514d5c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/pete.xml @@ -0,0 +1,36 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<StockQuotes> +<Stock> +<Symbol>IBM</Symbol> +<Last>79.78</Last> +<Date>5/24/2006</Date> +<Time>4:01pm</Time> +<Change>0.00</Change> +<Open>N/A</Open> +<High>N/A</High> +<Low>N/A</Low> +<Volume>900</Volume> +<MktCap>123.7B</MktCap> +<PreviousClose>79.78</PreviousClose> +<PercentageChange>0.00</PercentageChange> +<AnnRange>73.45 - 89.94</AnnRange> +<Earns>5.121</Earns> +<P-E>15.58</P-E> +<Name>INTL BUSINESS MAC</Name> +</Stock> +</StockQuotes> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/pete.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/pete.xsd new file mode 100644 index 0000000000..5f4c0e1ac9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/pete.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="StockQuotes"> + <xs:complexType > + <xs:sequence> + <xs:element name="Stock" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="1" name="Symbol" type="xs:string"/> + <xs:element minOccurs="0" maxOccurs="1" name="Last" type="xs:float"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> +</xs:element> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> + </xs:element> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/querytest.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/querytest.txt new file mode 100644 index 0000000000..9b895282a0 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/querytest.txt @@ -0,0 +1,17 @@ +Expected employee3: got Employee3 +Expected employee1: got Employee1 +Expected employee2: got Employee2 +Expected employee1: got Employee1 +Expected employee1: got Employee1 +Expected employee1: got Employee1 +Expected employee1: got Employee1 +Expected employee3: got Employee3 +Expected employee2: got Employee2 +Expected employee2: got Employee2 +Expected employee2: got Employee2 +Expected employee2: got Employee2 +Normal exception caught +Normal exception caught +Normal exception caught +Normal exception caught +Normal exception caught diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.txt new file mode 100644 index 0000000000..fa36e7113c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"><sdo:changeSummary xmlns:sdo="commonj.sdo"><create>#/departments.0/employees.0</create><create>#/departments.0/employees.1</create><create>#/departments.0/employees.2</create><create>#/departments.0/employees.0/opendataobjectlist.0</create><departments sdo:ref="#/departments.0" name="" location="" number=""/></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"><openintlist>45</openintlist><opendataobjectlist xsi:type="OpenType" name="MyOpenName"/><opendataobject xsi:type="OpenType" name="MyOpenName"/></employees><employees name="Boris" SN="E0002" manager="true"/><employees name="Carl" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.xml new file mode 100644 index 0000000000..fa36e7113c --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<company xmlns="companyNS" xsi:type="CompanyType" xmlns:tns="companyNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="ACME"><sdo:changeSummary xmlns:sdo="commonj.sdo"><create>#/departments.0/employees.0</create><create>#/departments.0/employees.1</create><create>#/departments.0/employees.2</create><create>#/departments.0/employees.0/opendataobjectlist.0</create><departments sdo:ref="#/departments.0" name="" location="" number=""/></sdo:changeSummary><departments name="Advanced Technologies" location="NY" number="123"><employees name="Albert" SN="E0001" openstring="Value Of Open String" openboolean="true"><openintlist>45</openintlist><opendataobjectlist xsi:type="OpenType" name="MyOpenName"/><opendataobject xsi:type="OpenType" name="MyOpenName"/></employees><employees name="Boris" SN="E0002" manager="true"/><employees name="Carl" SN="E0003"/></departments></company> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.xsd new file mode 100644 index 0000000000..f5066094fd --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/saveopen-output.xsd @@ -0,0 +1 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns="companyNS" targetNamespace="companyNS"><xsd:element name="companyType" type="CompanyType"/><xsd:complexType name="CompanyType" sdo:aliasName="TheFirm TheBigFirm"><xsd:sequence><xsd:element name="departments" type="tns:DepartmentType" minOccurs="0" maxOccurs="unbounded" sdo:aliasName="TheDepartments MYDepartments"/></xsd:sequence><xsd:element name="changeSummary" type="sdo:ChangeSummaryType"/><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="employeeOfTheMonth" sdoxml:propertyType="tns:EmployeeType" type="xsd:IDREF"/></xsd:complexType><xsd:element name="departmentType" type="DepartmentType"/><xsd:complexType name="DepartmentType"><xsd:sequence><xsd:element name="employees" type="tns:EmployeeType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="location" type="xsd:String"/><xsd:attribute name="number" type="xsd:String"/></xsd:complexType><xsd:element name="employeeType" type="EmployeeType"/><xsd:complexType name="EmployeeType"><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="SN" type="xsd:String"/><xsd:attribute name="manager" type="xsd:boolean"/><xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/><xsd:anyAttribute namespace="##any" processContents="lax"/></xsd:complexType><xsd:element name="openType" type="OpenType"/><xsd:complexType name="OpenType"><xsd:attribute name="name" type="xsd:String"/></xsd:complexType><xsd:attribute name="openboolean" type="xsd:boolean"/><xsd:element name="opendataobject" type="tns:OpenType" minOccurs="0"/><xsd:element name="opendataobjectlist" type="tns:OpenType" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="openintlist" type="xsd:short" minOccurs="0" maxOccurs="unbounded"/><xsd:attribute name="openstring" type="xsd:hexBinary"/></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-sca.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-sca.xsd new file mode 100644 index 0000000000..dee53020ab --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-sca.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="binding.sca" type="sca:SCARemoteBinding" substitutionGroup="sca:binding" sdo:name="bindingSca"/> + <complexType name="SCARemoteBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="target" type="anyURI" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-webservice.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-webservice.xsd new file mode 100644 index 0000000000..c73bffe1e8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-webservice.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="binding.ws" type="sca:WebServiceBinding" substitutionGroup="sca:binding"/> + <complexType name="WebServiceBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="port" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-ws.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-ws.xsd new file mode 100644 index 0000000000..84de1db758 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-binding-ws.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="binding.ws" type="sca:WebServiceBinding" substitutionGroup="sca:binding" sdo:name="bindingWs"/> + <complexType name="WebServiceBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="port" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-core.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-core.xsd new file mode 100644 index 0000000000..7b5c4199bf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-core.xsd @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-policy.xsd" /> + + <element name="componentType" type="sca:ComponentType"/> + <complexType name="ComponentType"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="service" type="sca:Service"/> + <element minOccurs="0" maxOccurs="unbounded" name="reference" type="sca:Reference"/> + <element minOccurs="0" maxOccurs="unbounded" ref="sca:property"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="Service"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="interface" type="sca:Interface"/> + <complexType name="Interface"/> + + <complexType name="Reference"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="property" type="sca:Property"/> + <complexType name="Property" abstract="true"> + <attribute name="name" type="NCName" use="required"/> + <attribute name="many" type="boolean" default="false" use="optional"/> + <attribute name="default" type="string" use="optional"/> + </complexType> + + + <element name="moduleFragment" type="sca:ModuleFragment"/> + <complexType name="ModuleFragment"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="entryPoint" type="sca:EntryPoint"/> + <element minOccurs="0" maxOccurs="unbounded" name="component" type="sca:Component"/> + <element minOccurs="0" maxOccurs="unbounded" name="externalService" type="sca:ExternalService"/> + <element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:ModuleWire"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="module" type="sca:ModuleFragment"/> + + + <complexType name="EntryPoint"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <element minOccurs="1" maxOccurs="1" ref="sca:binding"/> + <element minOccurs="1" maxOccurs="1" name="reference" type="anyType"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="overridable" type="boolean" default="true" use="optional"/> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + <!-- a multiplicity 1..1 sample + <reference>StockQuoteComponent</reference> - type must be URI + a multiplicity 0..n sample + <reference> + <value>StockQuoteComponent1</value> - type must be URI + <value>StockQuoteComponent2</value> + </reference> + --> + + <element name="binding" type="sca:Binding"/> + <complexType name="Binding"/> + + + <complexType name="Component"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:implementation"/> + <element minOccurs="0" maxOccurs="1" name="properties" type="sca:PropertyValues"/> + <element minOccurs="0" maxOccurs="1" name="references" type="sca:ReferenceValues"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + <!-- a multiplicity 1..1 sample + <references> + <v:stockQuote>StockQuoteComponent</v:stockquote> - type must be URI + </references> + a multiplicity 0..n sample + <references> + <v:stockQuote> + <value>StockQuoteComponent1</value> - type must be URI + <value>StockQuoteComponent2</value> + </v:stockquote> + </references> + --> + + <element name="implementation" type="sca:Implementation"/> + <complexType name="Implementation"/> + + <complexType name="PropertyValues"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + </complexType> + + <complexType name="ReferenceValues"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + </complexType> + + + <complexType name="ExternalService"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <element minOccurs="1" maxOccurs="1" ref="sca:binding"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="overridable" type="boolean" default="true" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + + + <complexType name="ModuleWire"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:source.uri" sdo:name="sourceUri"/> + <element minOccurs="1" maxOccurs="1" ref="sca:target.uri" sdo:name="targetUri"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="source.uri" type="anyURI" substitutionGroup="sca:source" sdo:name="sourceUri"/> + <element name="target.uri" type="anyURI" substitutionGroup="sca:target" sdo:name="targetUri"/> + + + <element name="subsystem" type="sca:Subsystem"/> + <complexType name="Subsystem"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="entryPoint" type="sca:EntryPoint"/> + <element minOccurs="0" maxOccurs="unbounded" name="moduleComponent" type="sca:ModuleComponent"/> + <element minOccurs="0" maxOccurs="unbounded" name="externalService" type="sca:ExternalService"/> + <element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:SystemWire"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + + <complexType name="ModuleComponent"> + <sequence> + <element minOccurs="0" maxOccurs="1" name="references" type="sca:ReferenceValues"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="module" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="SystemWire"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:source.uri" sdo:name="sourceUri"/> + <element minOccurs="1" maxOccurs="1" ref="sca:target.uri" sdo:name="targetUri" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + </complexType> + + <element name="source" type="anyType"/> + <element name="source.epr" type="anyType" substitutionGroup="sca:source" sdo:name="sourceEpr"/> + + <element name="target" type="anyType"/> + <element name="target.epr" type="anyType" substitutionGroup="sca:target" sdo:name="targetEpr"/> + + + <simpleType name="Multiplicity"> + <restriction base="string"> + <enumeration value="0..1"/> + <enumeration value="1..1"/> + <enumeration value="0..n"/> + <enumeration value="1..n"/> + </restriction> + </simpleType> + + <simpleType name="Scope"> + <restriction base="string"> + <enumeration value="instance"/> + <enumeration value="request"/> + <enumeration value="session"/> + <enumeration value="module"/> + </restriction> + </simpleType> + +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-dll.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-dll.xsd new file mode 100644 index 0000000000..a9ef738420 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-dll.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="implementation.dll" type="sca:DLLImplementation" substitutionGroup="sca:implementation" sdo:name="implementationDll"/> + <complexType name="DLLImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="dll" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-java.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-java.xsd new file mode 100644 index 0000000000..b5f20f2ff4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-java.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="implementation.java" type="sca:JavaImplementation" substitutionGroup="sca:implementation" sdo:name="implementationJava"/> + <complexType name="JavaImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-local-java.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-local-java.xsd new file mode 100644 index 0000000000..5c7c87ffdd --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-implementation-local-java.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="implementation.local.java" type="sca:LocalJavaImplementation" substitutionGroup="sca:implementation" sdo:name="implementationLocalJava"/> + <complexType name="LocalJavaImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <attribute name="scope" type="sca:Scope" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-cpp.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-cpp.xsd new file mode 100644 index 0000000000..81ff6bbcf5 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-cpp.xsd @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="interface.cpp" type="sca:CPPInterface" substitutionGroup="sca:interface" + sdo:name="interfaceCpp"/> + <complexType name="CPPInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <element minOccurs="1" name="operation" type="sca:Operation"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + + <!-- C++ operation declaration --> + <complexType name="Operation"> + <complexContent> + <sequence> + <element minOccurs="1" maxOccurs="1" name="return" type="sca:ReturnType"/> + <element minOccurs="0" name="parameter" type="sca:ParameterType"/> + </sequence> + <attribute name="name" type="string" use="required"/> + </complexContent> + </complexType> + + <simpleType name="ReturnType"> + <restriction base="string"> + <enumeration value="float"/> + <enumeration value="void"/> + </restriction> + </simpleType> + + <simpleType name="ParameterType"> + <restriction base="string"> + <enumeration value="float"/> + <enumeration value="const char *"/> + </restriction> + </simpleType> + + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-java.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-java.xsd new file mode 100644 index 0000000000..fa132ff69a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-java.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="interface.java" type="sca:JavaInterface" substitutionGroup="sca:interface" sdo:name="interfaceJava"/> + <complexType name="JavaInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="interface" type="NCName" use="required"/> + <attribute name="callbackInterface" type="NCName" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-wsdl.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-wsdl.xsd new file mode 100644 index 0000000000..0cfcfeaebd --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-interface-wsdl.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="interface.wsdl" type="sca:WSDLPortType" substitutionGroup="sca:interface" sdo:name="interfaceWsdl"/> + <complexType name="WSDLPortType"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="interface" type="anyURI" use="required"/> + <attribute name="callbackInterface" type="anyURI" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-property-java.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-property-java.xsd new file mode 100644 index 0000000000..4507752312 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-property-java.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="property.java" type="sca:JavaProperty" substitutionGroup="sca:property" sdo:name="propertyJava"/> + <complexType name="JavaProperty"> + <complexContent> + <extension base="sca:Property"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-property-xsd.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-property-xsd.xsd new file mode 100644 index 0000000000..7fcbd45a6a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca-property-xsd.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sdo="commonj.sdo/XML" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="property.xsd" type="sca:XSDProperty" substitutionGroup="sca:property" sdo:name="propertyXsd"/> + <complexType name="XSDProperty"> + <complexContent> + <extension base="sca:Property"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="type" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca.xsd new file mode 100644 index 0000000000..39a39bab36 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sca.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.commonj.org/xmlns/sca/v0.0.1/" + xmlns:sca="http://www.commonj.org/xmlns/sca/v0.0.1/"> + + <include schemaLocation="sca-core.xsd"/> + + <include schemaLocation="sca-interface-wsdl.xsd"/> + <include schemaLocation="sca-interface-cpp.xsd"/> + <include schemaLocation="sca-interface-java.xsd"/> + + <include schemaLocation="sca-property-xsd.xsd"/> + + <include schemaLocation="sca-implementation-dll.xsd"/> + + <include schemaLocation="sca-implementation-java.xsd"/> + <include schemaLocation="sca-implementation-local-java.xsd"/> + + <include schemaLocation="sca-binding-ws.xsd"/> + + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario1.txt new file mode 100644 index 0000000000..a0a3c7a203 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario1.txt @@ -0,0 +1,10 @@ +Created object in changed list +The object is myspace#Company +===== Modified Object Starts +Xpath:#/ +The modified objects type is myspace#Root +===== Old Property Values Begin +Property companies[0](UNSET) of type DataObject - object null or unset + +===== Old Property Values End +=====Modified Object Ends diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario2.txt new file mode 100644 index 0000000000..9728bd6f0a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario2.txt @@ -0,0 +1,8 @@ +===== Modified Object Starts +Xpath:#/companies.0 +The modified objects type is myspace#Company +===== Old Property Values Begin +Property name of type String:acme + +===== Old Property Values End +=====Modified Object Ends diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario3.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario3.txt new file mode 100644 index 0000000000..e174f62538 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario3.txt @@ -0,0 +1,22 @@ +=====Deleted Object Starts +===== Old Property Values Begin +Property name of type String:acme + +Property id of type String:123 + +===== Old Property Values End +=====Deleted Object Ends +===== Modified Object Starts +Xpath:#/ +The modified objects type is myspace#Root +===== Old Property Values Begin +Property companies[0] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:acme + +Property id of type String:123 + +===== Old Property Values End + +===== Old Property Values End +=====Modified Object Ends diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario4.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario4.txt new file mode 100644 index 0000000000..f678499e15 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario4.txt @@ -0,0 +1,108 @@ +Created object in changed list +The object is myspace#Employee +===== Modified Object Starts +Xpath:#/companies.0/departments.0 +The modified objects type is myspace#Department +===== Old Property Values Begin +Property employees[0] of type DataObject object still exists + +Property employees[1] of type DataObject object still exists + +===== Old Property Values End +=====Modified Object Ends +===== Modified Object Starts +Xpath:#/companies.0/departments.1 +The modified objects type is myspace#Department +===== Old Property Values Begin +Property employees[0] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:Ed Memoire + +Property id of type String:1 + +===== Old Property Values End + +Property employees[1] of type DataObject object still exists + +===== Old Property Values End +=====Modified Object Ends +=====Deleted Object Starts +===== Old Property Values Begin +Property name of type String:Ed Memoire + +Property id of type String:1 + +===== Old Property Values End +=====Deleted Object Ends +=====Deleted Object Starts +===== Old Property Values Begin +Property name of type String:Ivor Payne + +Property id of type String:1 + +===== Old Property Values End +=====Deleted Object Ends +=====Deleted Object Starts +===== Old Property Values Begin +Property name of type String:Colin Poisson + +Property id of type String:2 + +===== Old Property Values End +=====Deleted Object Ends +=====Deleted Object Starts +===== Old Property Values Begin +Property name of type String:windows + +Property id of type String:1 + +Property employees[1] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:Colin Poisson + +Property id of type String:2 + +===== Old Property Values End + +Property employees[0] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:Ivor Payne + +Property id of type String:1 + +===== Old Property Values End + +===== Old Property Values End +=====Deleted Object Ends +===== Modified Object Starts +Xpath:#/companies.1 +The modified objects type is myspace#Company +===== Old Property Values Begin +Property departments[0] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:windows + +Property id of type String:1 + +Property employees[1] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:Colin Poisson + +Property id of type String:2 + +===== Old Property Values End + +Property employees[0] of type DataObject - object deleted +===== Old Property Values Begin +Property name of type String:Ivor Payne + +Property id of type String:1 + +===== Old Property Values End + +===== Old Property Values End + +Property departments[1] of type DataObject object still exists + +===== Old Property Values End +=====Modified Object Ends diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario5.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario5.txt new file mode 100644 index 0000000000..af5bf47102 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/scenario5.txt @@ -0,0 +1,8 @@ +===== Modified Object Starts +Xpath:#/companies.0 +The modified objects type is myspace#Company +===== Old Property Values Begin +Property eotm of type DataObject object still exists + +===== Old Property Values End +=====Modified Object Ends diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest.cpp new file mode 100644 index 0000000000..adcdf36a0e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest.cpp @@ -0,0 +1,8835 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: sdotest.cpp,v 1.22 2006/03/16 12:53:57 slattery Exp $ */ + +#include <stdio.h> + +#pragma warning(disable:4786) + +#include <iostream> +#include <fstream> +using namespace std; + + + +#include "sdotest.h" + + + + + +using namespace commonj::sdo; + + + +/* USED IN RCPTEST */ + +typedef struct { + //zend_object zo; /* The standard zend_object */ + DataObjectPtr dop; /* The Hydra DataObject */ + //zend_object *df; /* The Data Factory */ +} sdo_doimpl_object; + + +int sdotest::rcptest() +{ + + try { + DataFactoryPtr mdg; + sdo_doimpl_object* ptr; + + mdg = DataFactory::getDataFactory(); + mdg = 0; + mdg = DataFactory::getDataFactory(); + mdg = NULL; + mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + + mdg->addType("myspace","Company"); + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Root","companies", + "myspace","Company", true, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + + + ptr = new sdo_doimpl_object; + + ptr->dop = mdg->create((Type&)tcc); + + ptr->dop = 0; // null ; + return 1; + } + catch (SDORuntimeException e) + { + if (!silent) cout << "RefCountingPointer test failed" << endl; + return 0; + } +} + + + +int sdotest::changesummarytest() +{ + if (scenario5() == 0) return 0; + if (scenario1() == 0) return 0; + if (scenario2() == 0) return 0; + if (scenario3() == 0) return 0; + if (scenario4() == 0) return 0; + return 1; +} + + +int sdotest::scenario1() +{ + // scenario 1 + // create root type - root has cs + // create a company type. and containment ref from root, many valued. + // props on comp id, name both strings single v. + // create root object + // begin logging + // create a company obj. name=acme id=123 + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addPropertyToType("myspace","Root","whatever", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addType("myspace","Company"); + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Root","companies", + "myspace","Company", true, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + ChangeSummaryPtr cs = dor->getChangeSummary(); + cs->beginLogging(); + + DataObjectPtr com = dor->createDataObject("companies"); + com->setCString("name","acme"); + com->setCString("id","123"); + + FILE *f = fopen("scenario1.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open secnario1.dat" << endl; + return 0; + } + + dumpchangesummary(f, cs); + + fclose(f); + + cs->endLogging(); + + //expect cdo: + //root - isChanged + //comp - isCreated + + return comparefiles("scenario1.dat","scenario1.txt"); +} + + +int sdotest::testui() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("companyNS","MainType"); + + + /* Now add the properties to the types...*/ + + + const Type& tmain = mdg->getType("companyNS","MainType"); + const Type& tshort = mdg->getType("commonj.sdo","Short"); + const Type& tint = mdg->getType("commonj.sdo","Integer"); + + + mdg->addPropertyToType(tmain,"short",tshort,true); + mdg->addPropertyToType(tmain,"int",tint, true); + + DataObjectPtr main = mdg->create((Type&)tmain); + + DataObjectList& dol1 = main->getList("short"); + DataObjectList& dol2 = main->getList("int"); + DataObjectList& dol3 = main->getList((unsigned int)0); + DataObjectList& dol4 = main->getList(1); + + return 1; + } + + catch (SDORuntimeException e) + { + if (!silent) cout << "Unsigned integer test failed" << endl << e << endl; + return 0; + } + +} + + + +int sdotest::scenario5() +{ + // scenario 5 + // create root type - root has cs + // create a company type. and containment ref from root, many valued. + // props on comp id, name both strings single v. + // create root object + // begin logging + // create a company obj. name=acme id=123 + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addPropertyToType("myspace","Root","whatever", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Employee"); + mdg->addPropertyToType("myspace","Employee","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","eotm", + "myspace","Employee", false, false, false); + + mdg->addPropertyToType("myspace","Company","employees", + "myspace","Employee", true, false, true); + + mdg->addPropertyToType("myspace","Root","companies", + "myspace","Company", true, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + ChangeSummaryPtr cs = dor->getChangeSummary(); + + DataObjectPtr com = dor->createDataObject("companies"); + com->setCString("name","acme"); + com->setCString("id","123"); + + const Type& te = mdg->getType("myspace","Employee"); + + DataObjectPtr emp = mdg->create(te); + emp->setCString("name", "Mr Expendible"); + + DataObjectList& emps = com->getList("employees"); + + emps.append(emp); + + com->setDataObject("eotm",emp); + + cs->beginLogging(); + + com->unset("eotm"); + + FILE *f = fopen("scenario5.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open scenario5.dat" << endl; + return 0; + } + + dumpchangesummary(f, cs); + + fclose(f); + + cs->endLogging(); + + return comparefiles("scenario5.dat","scenario5.txt"); + + //expect com to have change record, nothing for eotm: + +} + +int sdotest::scenario2() +{ + // create root type - root has cs + // create a company type. and containment ref from root, many valued. + // 2 props on comp id, name both strings single v. + // create root object + // create a company obj. name=acme id=123 + // begin logging() + // name="megacorp" + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addPropertyToType("myspace","Root","whatever", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addType("myspace","Company"); + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Root","companies", + "myspace","Company", true, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectPtr com = dor->createDataObject("companies"); + com->setCString("name","acme"); + com->setCString("id","123"); + + ChangeSummaryPtr cs = dor->getChangeSummary(); + cs->beginLogging(); + + com->setCString("name","megacorp"); + + FILE *f = fopen("scenario2.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open scenario2.dat" << endl; + return 0; + } + + dumpchangesummary(f, cs); + + fclose(f); + + cs->endLogging(); + + //expect cdo: + //root- nothing + // company- isChanged + //setting prop=name, value="acme" + + return comparefiles("scenario2.dat","scenario2.txt"); + +} + +int sdotest::scenario3() +{ + + //create root type - root has cs + //create a company type. and containment ref from root, many valued. + //2 props on comp id, name both strings single v. + //create root object + //create a company obj. name=acme id=123 + //begin logging() + //delete company + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addPropertyToType("myspace","Root","whatever", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addType("myspace","Company"); + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Root","companies", + "myspace","Company", true, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectPtr com = dor->createDataObject("companies"); + com->setCString("name","acme"); + com->setCString("id","123"); + + ChangeSummaryPtr cs = dor->getChangeSummary(); + cs->beginLogging(); + + com->detach(); + + FILE *f = fopen("scenario3.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open scenario3.dat" << endl; + return 0; + } + + dumpchangesummary(f, cs); + + cs->endLogging(); + + fclose(f); + + // expect cdo + // root - changed + // company - deleted + + return comparefiles("scenario3.dat","scenario3.txt"); + +} + +int sdotest::scenario4() +{ + //create root type - root has cs + //create a company type. and containment ref from root, many valued. + //create a dept type. and containment ref from comp, many valued. + //create a emp type. and containment ref from dept, many valued. + // give name and id properties to comp,dept, emp + + //create root object + //create a company obj. name=acme id=123 + //create a company obj. name=megacorp id=124 + // give each company 2 depts + // give each dept 2 employees + + // begin logging() + // add new employee to first dept of acme + // delete employee from second dept of acme + + // change name of first employee of first dept megacorp. + // delete first dept of megacorp. + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addPropertyToType("myspace","Root","whatever", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addType("myspace","Company"); + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addType("myspace","Department"); + mdg->addPropertyToType("myspace","Department","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Department","id", + "commonj.sdo","String", false, false, false); + + mdg->addType("myspace","Employee"); + mdg->addPropertyToType("myspace","Employee","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Employee","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Root","companies", + "myspace","Company", true, false, true); + + mdg->addPropertyToType("myspace","Company","departments", + "myspace","Department", true, false, true); + + mdg->addPropertyToType("myspace","Department","employees", + "myspace","Employee", true, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectPtr com = dor->createDataObject("companies"); + com->setCString("name","acme"); + com->setCString("id","123"); + + DataObjectPtr dep = com->createDataObject("departments"); + dep->setCString("name","widgets"); + dep->setCString("id","1"); + + DataObjectPtr emp = dep->createDataObject("employees"); + emp->setCString("name","John O'Watt"); + emp->setCString("id","1"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Ida Know"); + emp->setCString("id","2"); + + + dep = com->createDataObject("departments"); + dep->setCString("name","gadgets"); + dep->setCString("id","2"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Ed Memoire"); + emp->setCString("id","1"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Phyllis Tyne"); + emp->setCString("id","2"); + + + DataObjectPtr com2 = dor->createDataObject("companies"); + com2->setCString("name","megacorp"); + com2->setCString("id","124"); + + dep = com2->createDataObject("departments"); + dep->setCString("name","windows"); + dep->setCString("id","1"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Ivor Payne"); + emp->setCString("id","1"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Colin Poisson"); + emp->setCString("id","2"); + + dep = com2->createDataObject("departments"); + dep->setCString("name","portholes"); + dep->setCString("id","2"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Graham Angreeneggs"); + emp->setCString("id","1"); + + emp = dep->createDataObject("employees"); + emp->setCString("name","Helen Highwater"); + emp->setCString("id","2"); + + DataObjectList& deps = com->getList("departments"); + DataObjectList& emps = deps[0]->getList("employees"); + DataObjectList& emps2 = deps[1]->getList("employees"); + DataObjectList& deps2 = com2->getList("departments"); + DataObjectList& emps3 = deps2[0]->getList("employees"); + DataObjectList& emps4 = deps2[1]->getList("employees"); + + // should be able to get the change summary property, but it + // should be zero. + // should be able to find out if the type is a change summary type + + if (! dor->getType().isChangeSummaryType()) + { + if (!silent) cout << "The root object DOESNT HAVE a change summary !!!" << endl; + return 0; + } + + try { + DataObjectPtr csptr = dor->getDataObject("whatever"); + + if (!csptr) { + if (!silent) cout << "CS property was zero - should be invisible!!!!" << endl; + return 0; + } + else { + if (!silent) cout << "CS property was NOT zero !!" << endl; + return 0; + } + } + catch (SDOPropertyNotFoundException e) + { + // cout << "No property shows - this is correct" << endl; + } + + + if (com->getType().isChangeSummaryType()) + { + if (!silent) cout << "The company object has a change summary !!!!" << endl; + return 0; + } + + ChangeSummaryPtr cs = dor->getChangeSummary(); + cs->beginLogging(); + + DataObjectList& depsout = com->getList("departments"); + + emp = depsout[0]->createDataObject("employees"); + emp->setCString("name","Irma Newby"); + emp->setCString("id","3"); + + DataObjectList& empsout = depsout[1]->getList("employees"); + empsout.remove(0); + + DataObjectList& depsout2 = com2->getList("departments"); + DataObjectList& empsout2 = depsout2[0]->getList("employees"); + empsout2[0]->setCString("name","Ive had my name changed"); + + depsout2[0]->detach(); + + FILE *f = fopen("scenario4.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open secnario4.dat" << endl; + return 0; + } + + dumpchangesummary(f, cs); + + cs->endLogging(); + + fclose(f); + + // expect: + // company acme, department widgets changed. + // employee 3 of dept widgets of acme (Irma Newby) created. + // employee 1 of dept gadgets or acme deleted + // no change record for employee 1 of company megacorp, dept windows + // deletion for dept windows of megacorp + // deletion for emp 1 of windows - showing original value for name (Ivor Payne) + // deletion for emp 2 of windows. + + return comparefiles("scenario4.dat","scenario4.txt"); + + +} + +int sdotest::seqtest() +{ + DataFactoryPtr mdg = DataFactory::getDataFactory(); + // company is sequenced. + mdg->addType("myspace","Company",true,false); + + mdg->addType("myspace","Department",true,false); + // string is many + + mdg->addPropertyToType("myspace","Company","string","commonj.sdo","String", + true); + + mdg->addPropertyToType("myspace","Company","departments","myspace","Department", + true); + + mdg->addPropertyToType("myspace","Department","name","commonj.sdo","String"); + + + const Type& tcc = mdg->getType("myspace","Company"); + + DataObjectPtr dor = mdg->create(tcc); + const Property& sprop = dor->getType().getProperty("string"); + SequencePtr sptr = dor->getSequence(); + + FILE *f = fopen("sequence.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Cannot open sequence.dat" << endl; + return 0; + } + + printseq(f, sptr); + + sptr->addCString(sprop,"I am Item 1 of string"); + + printseq(f, sptr); + + sptr->addText("I am the first free text"); + + printseq(f, sptr); + + sptr->addCString(sprop,"I am Item 2 of string"); + + printseq(f, sptr); + + sptr->setCStringValue(1,"I am free text which has been modified"); + + DataObjectPtr dep1 = dor->createDataObject("departments"); + + printseq(f, sptr); + + dep1->setCString("name","department1"); + + printseq(f, sptr); + + DataObjectList& dol = dor->getList("departments"); + + const Type& tcd = mdg->getType("myspace","Department"); + DataObjectPtr dep2 = mdg->create(tcd); + + printseq(f, sptr); + + dep2->setCString("name","department2"); + + printseq(f, sptr); + + dol.append(dep2); + + printseq(f, sptr); + + fclose(f); + + return comparefiles("sequence.dat","sequence.txt"); + + +} + + +int sdotest::boolbug() +{ + DataFactoryPtr mdg = DataFactory::getDataFactory(); + mdg->addType("myspace","Company"); + mdg->addPropertyToType("myspace","Company","bool","commonj.sdo","Boolean"); + const Type& tcc = mdg->getType("myspace","Company"); + DataObjectPtr dor = mdg->create((Type&)tcc); + try { + bool b = dor->getBoolean("bool"); + return 1; + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << "WRONG not set exception" << endl; + return 0; + } +} + +int sdotest::scope1() +{ + try + { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + return 1; + } + catch(SDORuntimeException e) + { + return 0; + } +} + +int sdotest::scope2() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + mdg->addType("myspace","Company"); + mdg->addPropertyToType("myspace","Company","csumm","commonj.sdo","ChangeSummary"); + const Type& tcc = mdg->getType("myspace","Company"); + DataObjectPtr dor = mdg->create((Type&)tcc); + return 1; + } + catch (SDORuntimeException e) + { + return 0; + } +} + +int sdotest::scope3() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + mdg->addType("myspace","Main"); + mdg->addType("myspace","Subs"); + mdg->addPropertyToType("myspace","Main","name","commonj.sdo","String"); + mdg->addPropertyToType("myspace","Main","subs","myspace","Subs", true); + mdg->addPropertyToType("myspace","Subs","name","commonj.sdo","String"); + + const Type& tcc = mdg->getType("myspace","Main"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectPtr sub = dor->createDataObject("subs"); + sub->setCString("name", "sub1"); + + sub = dor->createDataObject("subs"); + sub->setCString("name", "sub2"); + return 1; + } + catch (SDORuntimeException e) + { + return 0; + } + +} + +int sdotest::testGetters(DataObjectPtr dor) +{ + if (!testGetter(dor,"boolean")) return 0; + if (!testGetter(dor,"byte")) return 0; + if (!testGetter(dor,"character")) return 0; + if (!testGetter(dor,"short")) return 0; + if (!testGetter(dor,"integer")) return 0; + if (!testGetter(dor,"long")) return 0; + if (!testGetter(dor,"double")) return 0; + if (!testGetter(dor,"float")) return 0; + if (!testGetter(dor,"date")) return 0; + if (!testGetter(dor,"string")) return 0; + if (!testGetter(dor,"bytes")) return 0; + if (!testGetter(dor,"dataobject")) return 0; + return 1; +} + +int sdotest::testGetter(DataObjectPtr dor, char* str) +{ + + try { + bool b = dor->getBoolean(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + char by = dor->getByte(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + wchar_t cy = dor->getCharacter(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + short s = dor->getShort(str); + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + if (!strcmp(str,"bytes")) return 1; + return 0; + + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + int i = dor->getInteger(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + long l = dor->getLong(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + int64_t ll = dor->getLong(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + float f = dor->getFloat(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + long double d = dor->getDouble(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + unsigned int len; + + try { + len = dor->getLength(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + if (len > 0) { + try { + wchar_t * buf = new wchar_t[len]; + unsigned int gotlen = dor->getString(str,buf,len); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + try { + char * cbuf = new char[len]; + unsigned int gotlen = dor->getBytes(str,cbuf,len); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + } + + try { + SDODate t = dor->getDate(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << " WRONG unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"boolean")) return 1; + if (!strcmp(str,"boolean")) return 1; + if (!strcmp(str,"string")) return 1; + if (!strcmp(str,"dataobject")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + const char * string = dor->getCString(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG - unset and undefaulted" << endl; + return 0; + } + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 1; + if (!strcmp(str,"date")) return 1; + return 0; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + + try { + DataObjectPtr dob = dor->getDataObject(str); + } + catch (SDOPropertyNotSetException pe) + { + if (!silent) cout << "WRONG unset and undefaulted" << endl; + return 0; + } + + catch (SDOInvalidConversionException ec) + { + if (!strcmp(str,"dataobject")) return 0; + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << endl; + return 0; + } + return 1; + +} + +int sdotest::conversiontest() +{ + //cout << "Conversion tests" << endl; + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + mdg->addType("myspace","Container"); + mdg->addType("myspace","Contained"); + mdg->addPropertyToType("myspace","Container","boolean","commonj.sdo","Boolean"); + mdg->addPropertyToType("myspace","Container","byte","commonj.sdo","Byte"); + mdg->addPropertyToType("myspace","Container","character","commonj.sdo","Character"); + mdg->addPropertyToType("myspace","Container","short","commonj.sdo","Short"); + mdg->addPropertyToType("myspace","Container","integer","commonj.sdo","Integer"); + mdg->addPropertyToType("myspace","Container","long","commonj.sdo","Long"); + mdg->addPropertyToType("myspace","Container","float","commonj.sdo","Float"); + mdg->addPropertyToType("myspace","Container","double","commonj.sdo","Double"); + mdg->addPropertyToType("myspace","Container","string","commonj.sdo","String"); + mdg->addPropertyToType("myspace","Container","bytes","commonj.sdo","Bytes"); + mdg->addPropertyToType("myspace","Container","dataobject","myspace","Contained"); + mdg->addPropertyToType("myspace","Container","date","commonj.sdo","Date"); + mdg->addPropertyToType("myspace","Container","bigint","commonj.sdo","BigInteger"); + mdg->addPropertyToType("myspace","Container","bigdec","commonj.sdo","BigDecimal"); + + + const Type& tcc = mdg->getType("myspace","Container"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + // phase 1 - all unset....... + + // cout << "+++++++++++++++PROPERTY VALUES UNSET ++++++++++++++++++" << endl; + + if (!testGetters(dor)) return 0; + + // cout << "+++++++++++++++PROPERTY VALUES SET ++++++++++++++++++++" << endl; + + // RHEL 4 has problems processing 64 bit integer constants, so we'll do it the hard way + // This is overkill but gives the option to vary the value a bit. + + int64_t largeInt = 0xFFFF; + for (int j = 0; j < 2; j++) + { + largeInt <<= 16; + largeInt += 0xFFFF; + } + + DataObjectPtr sub = dor->createDataObject("dataobject"); + dor->setBoolean("boolean", true); + dor->setByte("byte",20); + dor->setCharacter("character", 1000); + dor->setShort("short", (short)12345678); + dor->setInteger("integer", 87654321); + dor->setLong("long", largeInt); + dor->setFloat("float", (float)12345.678); + dor->setDouble("double", 1234567.891); + dor->setDate("date", 37575); + wchar_t* chars = new wchar_t[50]; + for (int i=0;i<50;i++) {chars[i] = 0x7F20 + i ;} + dor->setString("string",chars, 50); + + char* tchars = new char[50]; + for (int ii=0;ii<50;ii++) {tchars[ii] = ii + 32;} + dor->setBytes("bytes",tchars, 50); + + + if (!testGetters(dor)) return 0; + + // cout << "+++++++++++++++END OF TEST ++++++++++++++++++++++++++++" << endl; + + return 1; +} + + +int sdotest::usertest() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addType("myspace","UserTest"); + mdg->addType("myspace","AnObject"); + + const Type& tr = mdg->getType("myspace", "Root"); + const Type& tm = mdg->getType("myspace", "UserTest"); + const Type& to = mdg->getType("myspace", "AnObject"); + + mdg->addPropertyToType(tm,"boolean", "commonj.sdo","Boolean"); + mdg->addPropertyToType(tm,"unsetboolean", "commonj.sdo","Boolean"); + mdg->addPropertyToType(tm,"object", "myspace","AnObject"); + mdg->addPropertyToType(tm,"unsetobject","myspace","AnObject"); + + // many valued... + mdg->addPropertyToType(tm,"longs", "commonj.sdo","Integer", true); + mdg->addPropertyToType(tm,"objects", "myspace","AnObject", true); + + mdg->addPropertyToType(tr,"usertest", "myspace","UserTest"); + + DataObjectPtr root = mdg->create((Type&)tr); + DataObjectPtr test = root->createDataObject("usertest"); + DataObjectPtr do1 = test->createDataObject("object"); + DataObjectPtr do2 = test->createDataObject("objects"); + DataObjectPtr do3 = test->createDataObject("objects"); + + test->setBoolean("boolean", true); + + + void* value = (void*)0xF1F1F1F1; + + test->setUserData(value); + + if (test->getUserData() != (void*)0xf1f1f1f1) return 0; + + root->setUserData("usertest",value); + + if (root->getUserData("usertest") != (void*)0xf1f1f1f1) return 0; + + root->setUserData((unsigned int)0,(void*)0x20); + + if (root->getUserData((unsigned int)0) != (void*)0x20) return 0; + + const Property& prop = root->getType().getProperty("usertest"); + + root->setUserData(prop,(void*)0x40020); + + if (root->getUserData(prop) != (void*)0x40020) return 0;; + + test->setUserData("boolean", (void*)0x120); + + + if (test->getUserData("boolean") != (void*)0) return 0; + + test->setUserData("unsetboolean", (void*)0x340); + + if (test->getUserData("unsetboolean") != (void*)0) return 0; + + test->setUserData("object", (void*)0x120); + + if (test->getUserData("object") != (void*)0x120) return 0; + + test->setUserData("unsetobject", (void*)0x540); + + if (test->getUserData("unsetobject") != (void*)0) return 0; + + test->setUserData("objects", (void*)0x640); + + if (test->getUserData("objects") != (void*)0x640) return 0; + + test->setUserData("objects[1]", (void*)0x740); + + if (test->getUserData("objects[1]") != (void*)0x740) return 0; + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << "Exception in user test - unexpected" << endl; + return 0; + } +} + +int sdotest::versiontest() +{ + if (!silent) cout << "The SDO version is :" << SdoRuntime::getVersion() << endl; + if (!silent) cout << "The Major version is: " << SdoRuntime::getMajor() << endl; + if (!silent) cout << "The Minor version is: " << SdoRuntime::getMinor() << endl; + if (!silent) cout << "The Fix level is: " << SdoRuntime::getFix() << endl; + return 1; +} + +int sdotest::noncontest() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Department"); + mdg->addType("myspace","Employee"); + + const Type& tr = mdg->getType("myspace", "Company"); + const Type& tm = mdg->getType("myspace", "Department"); + const Type& to = mdg->getType("myspace", "Employee"); + + // many... + mdg->addPropertyToType(tr,"departments","myspace", "Department", + true); + + //mdg->addPropertyToType(to,"name","commonj.sdo", "String"); + + mdg->addPropertyToType(tm,"employees","myspace", "Employee", true); + + // single, non containment + mdg->addPropertyToType(tr,"eom", "myspace","Employee", false + , false, false); + + DataObjectPtr comp = mdg->create((Type&)tr); + + { + DataObjectPtr dept = comp->createDataObject("departments"); + DataObjectPtr emp1 = dept->createDataObject("employees"); + //emp1->setCString("name", "Will"); + DataObjectPtr emp2 = dept->createDataObject("employees"); + //emp1->setCString("name", "Bill"); + DataObjectPtr emp3 = dept->createDataObject("employees"); + //emp1->setCString("name", "Gill"); + comp->setDataObject("eom", emp3); + } + return 1; + } + catch (SDORuntimeException e) + { + if (!silent) cout << "Failed in containment" << e << endl; + return 0; + } +} + + +int sdotest::defaulttest() +{ + try{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","DefaultTest"); + mdg->addType("myspace","AnObject"); + + const Type& tm = mdg->getType("myspace", "DefaultTest"); + const Type& to = mdg->getType("myspace", "AnObject"); + + mdg->addPropertyToType(tm,"boolean", "commonj.sdo","Boolean"); + + mdg->setDefault("myspace","DefaultTest","boolean", true); + + mdg->addPropertyToType(tm,"byte", "commonj.sdo","Byte"); + + mdg->setDefault("myspace","DefaultTest","byte", (char)'d'); + + mdg->addPropertyToType(tm,"character", "commonj.sdo","Character"); + + mdg->setDefault("myspace","DefaultTest","character", (wchar_t)'e'); + + mdg->addPropertyToType(tm,"short", "commonj.sdo","Short"); + + mdg->setDefault("myspace","DefaultTest","short", (short)300); + + mdg->addPropertyToType(tm,"long", "commonj.sdo","Integer"); + + mdg->setDefault("myspace","DefaultTest","long", (long)400); + + mdg->addPropertyToType(tm,"longs", "commonj.sdo","Integer", true); + + mdg->setDefault("myspace","DefaultTest","longs", (long)800); + + mdg->addPropertyToType(tm,"longlong", "commonj.sdo","Long"); + + mdg->setDefault("myspace","DefaultTest","longlong", (int64_t)500); + + mdg->addPropertyToType(tm,"float", "commonj.sdo","Float"); + + mdg->setDefault("myspace","DefaultTest","float", (float)600.0); + + mdg->addPropertyToType(tm,"longdouble", "commonj.sdo","Double"); + + mdg->setDefault("myspace","DefaultTest","longdouble", (long double)700.0); + + mdg->addPropertyToType(tm,"date", "commonj.sdo","Date"); + + mdg->setDefault("myspace","DefaultTest","date", (long)900); + + mdg->addPropertyToType(tm,"string", "commonj.sdo","String"); + + wchar_t* help = new wchar_t[4]; + help[0] = 'H'; + help[1] = 'E'; + help[2] = 'L'; + help[3] = 'P'; + + mdg->setDefault("myspace","DefaultTest","string", help, 4); + + delete help; + + char* help2 = new char[4]; + help2[0] = 'H'; + help2[1] = 'E'; + help2[2] = 'L'; + help2[3] = 'P'; + + mdg->addPropertyToType(tm,"bytes", "commonj.sdo","Bytes"); + + mdg->setDefault("myspace","DefaultTest","bytes", help2, 4); + + delete help2; + + mdg->addPropertyToType(tm,"object", "myspace","AnObject"); + + DataObjectPtr test = mdg->create((Type&)tm); + + FILE *f = fopen("defaults.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open file defaults.dat" << endl; + return 0; + } + + + fprintf(f, "Boolean default is true: %d\n",test->getBoolean("boolean")); + + fprintf(f, "Byte default is d: %d\n",test->getByte("byte")); + + fprintf(f, "Character default is e: %d\n",test->getCharacter("character")); + + fprintf(f, "Short default is 300: %d\n",test->getShort("short")); + + fprintf(f, "Long default is 400: %d\n",test->getInteger("long")); + + try { + fprintf(f, "Longs default is 800: %d\n" ,test->getInteger("longs[1]")); + } + catch (SDOIndexOutOfRangeException ex) + { + fprintf(f,"Expected index out of range OK\n"); + } + + fprintf(f,"Float default is 600: %.3f\n",test->getFloat("float")); + + fprintf(f, "LongDouble default is 700: %.3f\n",(float)test->getDouble("longdouble")); + + fprintf(f, "String default is HELP: "); + unsigned int lenw = test->getLength("string"); + if (lenw > 0) { + char* tw = new char[lenw]; + test->getBytes("string",tw,lenw); + for (int i=0;i<lenw;i++) + { + fprintf(f,"%c",tw[i]); + } + fprintf(f,"\n"); + } + + fprintf(f,"Bytes default is HELP: "); + unsigned int len = test->getLength("bytes"); + if (len > 0) { + char* tc = new char[len]; + test->getBytes("bytes",tc,len); + for (int i=0;i<len;i++) + { + fprintf(f,"%c", tc[i]); + } + fprintf(f,"\n"); + } + fclose (f); + return comparefiles("defaults.dat","defaults.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << e.getEClassName() << " in "; + if (!silent)cout << e.getFileName() << " at line "; + if (!silent)cout << e.getLineNumber() << endl; + if (!silent)cout << e.getFunctionName() << " "; + if (!silent)cout << e.getMessageText() << endl; + return 0; + } +} + +// Re-write of defaulttest to use methods taking SDOString parameters +int sdotest::defaulttest_strobj() +{ + + SDOString ns1("myspace"); + SDOString testName("DefaultTest"); + SDOString objectName("AnObject"); + SDOString propName("commonj.sdo"); + + try{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType(ns1, testName); + mdg->addType(ns1, objectName); + + const Type& tm = mdg->getType(ns1, testName); + const Type& to = mdg->getType(ns1, objectName); + + mdg->addPropertyToType(tm, "boolean", propName, "Boolean"); + + mdg->setDefault(ns1, testName, "boolean", true); + + mdg->addPropertyToType(tm, "byte", propName, "Byte"); + + mdg->setDefault(ns1, testName, "byte", (char)'d'); + + mdg->addPropertyToType(tm, "character", propName, "Character"); + + mdg->setDefault(ns1, testName, "character", (wchar_t)'e'); + + mdg->addPropertyToType(tm, "short", propName, "Short"); + + mdg->setDefault(ns1, testName, "short", (short)300); + + mdg->addPropertyToType(tm, "long", propName, "Integer"); + + mdg->setDefault(ns1, testName, "long", (long)400); + + mdg->addPropertyToType(tm, "longs", propName, "Integer", true); + + mdg->setDefault(ns1, testName, "longs", (long)800); + + mdg->addPropertyToType(tm, "longlong", propName, "Long"); + + mdg->setDefault(ns1, testName, "longlong", (int64_t)500); + + mdg->addPropertyToType(tm, "float", propName, "Float"); + + mdg->setDefault(ns1, testName, "float", (float)600.0); + + mdg->addPropertyToType(tm, "longdouble", propName, "Double"); + + mdg->setDefault(ns1, testName, "longdouble", (long double)700.0); + + mdg->addPropertyToType(tm, "date", propName, "Date"); + + mdg->setDefault(ns1, testName, "date", (long)900); + + mdg->addPropertyToType(tm, "string", propName, "String"); + + wchar_t* help = new wchar_t[4]; + help[0] = 'H'; + help[1] = 'E'; + help[2] = 'L'; + help[3] = 'P'; + + mdg->setDefault(ns1, testName, "string", help, 4); + + delete help; + + char* help2 = new char[4]; + help2[0] = 'H'; + help2[1] = 'E'; + help2[2] = 'L'; + help2[3] = 'P'; + + mdg->addPropertyToType(tm, "bytes", propName, "Bytes"); + + mdg->setDefault(ns1, testName, "bytes", help2, 4); + + delete help2; + + mdg->addPropertyToType(tm, "object", ns1, objectName); + + DataObjectPtr test = mdg->create((Type&)tm); + + FILE *f = fopen("defaults.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open file defaults.dat" << endl; + return 0; + } + + + fprintf(f, "Boolean default is true: %d\n",test->getBoolean("boolean")); + + fprintf(f, "Byte default is d: %d\n",test->getByte("byte")); + + fprintf(f, "Character default is e: %d\n",test->getCharacter("character")); + + fprintf(f, "Short default is 300: %d\n",test->getShort("short")); + + fprintf(f, "Long default is 400: %d\n",test->getInteger("long")); + + try { + fprintf(f, "Longs default is 800: %d\n" ,test->getInteger("longs[1]")); + } + catch (SDOIndexOutOfRangeException ex) + { + fprintf(f,"Expected index out of range OK\n"); + } + + fprintf(f,"Float default is 600: %.3f\n",test->getFloat("float")); + + fprintf(f, "LongDouble default is 700: %.3f\n",(float)test->getDouble("longdouble")); + + fprintf(f, "String default is HELP: "); + unsigned int lenw = test->getLength("string"); + if (lenw > 0) { + char* tw = new char[lenw]; + test->getBytes("string",tw,lenw); + for (int i=0;i<lenw;i++) + { + fprintf(f,"%c",tw[i]); + } + fprintf(f,"\n"); + } + + fprintf(f,"Bytes default is HELP: "); + unsigned int len = test->getLength("bytes"); + if (len > 0) { + char* tc = new char[len]; + test->getBytes("bytes",tc,len); + for (int i=0;i<len;i++) + { + fprintf(f,"%c", tc[i]); + } + fprintf(f,"\n"); + } + fclose (f); + return comparefiles("defaults.dat","defaults.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << e.getEClassName() << " in "; + if (!silent)cout << e.getFileName() << " at line "; + if (!silent)cout << e.getLineNumber() << endl; + if (!silent)cout << e.getFunctionName() << " "; + if (!silent)cout << e.getMessageText() << endl; + return 0; + } +} + + +int sdotest::showdefault(FILE *f, const Type& tm) +{ + const Property& pboolean = tm.getProperty("boolean"); + const Property& pbyte = tm.getProperty("byte"); + const Property& pcharacter = tm.getProperty("character"); + const Property& pshort = tm.getProperty("short"); + const Property& plong = tm.getProperty("long"); + const Property& plongs = tm.getProperty("longs"); + const Property& plonglong = tm.getProperty("longlong"); + const Property& pfloat = tm.getProperty("float"); + const Property& plongdouble = tm.getProperty("longdouble"); + const Property& pdate = tm.getProperty("date"); + const Property& pstring = tm.getProperty("string"); + const Property& pbytes = tm.getProperty("bytes"); + const Property& pobject = tm.getProperty("object"); + + // first see what we get for the default when there is none + + bool bb = pboolean.getBooleanDefault(); + const char* bs = pboolean.getCStringDefault(); + + fprintf(f, "Boolean default is : %d\n",bb); + fprintf(f, "Boolean default as a string is %s\n",bs); + + char cc = pbyte.getByteDefault(); + const char* cs = pbyte.getCStringDefault(); + fprintf(f, "Byte default is : %d\n",cc); + fprintf(f, "Byte default as a string is %s\n",cs); + + wchar_t wc = pcharacter.getCharacterDefault(); + const char* ws = pcharacter.getCStringDefault(); + fprintf(f, "Character default is : %d\n",wc); + fprintf(f, "Character default as a string is %s\n",ws); + + short ss = pshort.getShortDefault(); + fprintf(f, "Short default is : %d\n",ss); + + long ll = plong.getIntegerDefault(); + fprintf(f, "Integer default is : %d\n",ll); + long ll2 = plongs.getLongDefault(); + fprintf(f, "Integer many default is : %d\n",ll2); + + int64_t llll = plonglong.getLongDefault(); + fprintf(f, "Long default is : %ld\n",(long)llll); + + float ff = pfloat.getFloatDefault(); + fprintf(f, "Float default is : %.3f\n",ff); + + long double dd = plongdouble.getDoubleDefault(); + fprintf(f, "Double default is : %.3f\n",(float)dd); + + const SDODate& sd = pdate.getDateDefault(); + fprintf(f, "Date default is : %d\n",sd.getTime()); + + unsigned int l = pstring.getDefaultLength(); + if (l > 0) + { + wchar_t * buf = new wchar_t[l+1]; + l = pstring.getStringDefault(buf,l); + fprintf(f, "String default length is %d\n", l); + for (int i=0;i<l;i++) + { + fprintf(f, "%c",buf[i]); + } + fprintf(f, "\n"); + delete buf; + const char* wws = pstring.getCStringDefault(); + fprintf(f, "String default as a string is %s\n", wws); + + } + else + { + fprintf(f, "String default is zero length\n"); + } + + l = pbytes.getDefaultLength(); + if (l > 0) + { + char * buf = new char[l+1]; + l = pbytes.getBytesDefault(buf,l); + fprintf(f, "Bytes default length is %d\n",l); + for (int i=0;i<l;i++) + { + fprintf(f, "%c", buf[i]); + } + fprintf(f, "\n"); + delete buf; + } + else + { + fprintf(f, "Bytes default is zero length\n"); + } + return 1; +} + + +int sdotest::propdefaulttest() +{ + try{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","DefaultTest"); + mdg->addType("myspace","AnObject"); + + const Type& tm = mdg->getType("myspace", "DefaultTest"); + const Type& to = mdg->getType("myspace", "AnObject"); + + mdg->addPropertyToType(tm,"boolean", "commonj.sdo","Boolean"); + mdg->addPropertyToType(tm,"byte", "commonj.sdo","Byte"); + mdg->addPropertyToType(tm,"character", "commonj.sdo","Character"); + mdg->addPropertyToType(tm,"short", "commonj.sdo","Short"); + mdg->addPropertyToType(tm,"long", "commonj.sdo","Integer"); + mdg->addPropertyToType(tm,"longs", "commonj.sdo","Integer", true); + mdg->addPropertyToType(tm,"longlong", "commonj.sdo","Long"); + mdg->addPropertyToType(tm,"float", "commonj.sdo","Float"); + mdg->addPropertyToType(tm,"longdouble", "commonj.sdo","Double"); + mdg->addPropertyToType(tm,"date", "commonj.sdo","Date"); + mdg->addPropertyToType(tm,"string", "commonj.sdo","String"); + mdg->addPropertyToType(tm,"bytes", "commonj.sdo","Bytes"); + mdg->addPropertyToType(tm,"object" , "myspace","AnObject"); + + //cout << "Testing unset defaults....." << endl; + + FILE *f; + + f = fopen("showdefault1.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open showdefault1.dat" << endl; + return 0; + } + showdefault(f, tm); + + fclose (f); + if (!comparefiles("showdefault1.dat","showdefault1.txt")) + { + return 0; + } + + //now set all the defaults.... + + mdg->setDefault("myspace","DefaultTest","boolean", true); + mdg->setDefault("myspace","DefaultTest","byte", (char)'d'); + mdg->setDefault("myspace","DefaultTest","character", (wchar_t)'e'); + mdg->setDefault("myspace","DefaultTest","short", (short)300); + mdg->setDefault("myspace","DefaultTest","long", (long)400); + mdg->setDefault("myspace","DefaultTest","longs", (long)800); + mdg->setDefault("myspace","DefaultTest","longlong", (int64_t)500); + mdg->setDefault("myspace","DefaultTest","float", (float)600.0); + mdg->setDefault("myspace","DefaultTest","longdouble", (long double)700.0); + mdg->setDefault("myspace","DefaultTest","date", (long)900); + + + wchar_t* help = new wchar_t[4]; + help[0] = 'H'; + help[1] = 'E'; + help[2] = 'L'; + help[3] = 'P'; + + mdg->setDefault("myspace","DefaultTest","string", help, 4); + + delete help; + + char* help2 = new char[4]; + help2[0] = 'H'; + help2[1] = 'E'; + help2[2] = 'L'; + help2[3] = 'P'; + + + mdg->setDefault("myspace","DefaultTest","bytes", help2, 4); + + delete help2; + + // and have another go at getting them.... + + f = fopen("showdefault2.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open showdefault2.dat" << endl; + return 0; + } + showdefault(f, tm); + + fclose (f); + if (!comparefiles("showdefault2.dat","showdefault2.txt")) + { + return 0; + } + + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << e.getEClassName() << " in "; + if (!silent)cout << e.getFileName() << " at line "; + if (!silent)cout << e.getLineNumber() << endl; + if (!silent)cout << e.getFunctionName() << " "; + if (!silent)cout << e.getMessageText() << endl; + return 0; + } + +} + +int sdotest::nulltest() +{ + + FILE *f = 0; + + try { + + int i; + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","NullTest",true, false); // sequenced + mdg->addType("myspace","AnObject"); + + const Type& tm = mdg->getType("myspace", "NullTest"); + const Type& to = mdg->getType("myspace", "AnObject"); + + mdg->addPropertyToType(tm,"boolean", "commonj.sdo","Boolean"); + mdg->addPropertyToType(tm,"byte", "commonj.sdo","Byte"); + mdg->addPropertyToType(tm,"character", "commonj.sdo","Character"); + mdg->addPropertyToType(tm,"short", "commonj.sdo","Short"); + mdg->addPropertyToType(tm,"long", "commonj.sdo","Integer"); + mdg->addPropertyToType(tm,"longlong", "commonj.sdo","Long"); + mdg->addPropertyToType(tm,"float", "commonj.sdo","Float"); + mdg->addPropertyToType(tm,"longdouble", "commonj.sdo","Double"); + mdg->addPropertyToType(tm,"date", "commonj.sdo","Date"); + mdg->addPropertyToType(tm,"string", "commonj.sdo","String"); + mdg->addPropertyToType(tm,"bytes", "commonj.sdo","Bytes"); + mdg->addPropertyToType(tm,"object", "myspace","AnObject"); + + + mdg->addPropertyToType(tm,"cs", "commonj.sdo","ChangeSummary"); + + DataObjectPtr test = mdg->create((Type&)tm); + DataObjectPtr ob = mdg->create((Type&)to); + DataObjectPtr ob2 = mdg->create((Type&)to); + DataObjectPtr ob3 = mdg->create((Type&)to); + + + f = fopen("nulltest.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open file nulltest.dat" << endl; + return 0; + } + + // first check all props are unset + + ChangeSummaryPtr cs = test->getChangeSummary(); + + cs->beginLogging(); + + PropertyList pl = test->getInstanceProperties(); + + fprintf(f, "Initially - all properties unset, and default values...\n"); + for (i=0;i<pl.size(); i++) + { + if (pl[i].isMany())continue; + try { + if (pl[i].getType().isDataType()) { + fprintf(f, "%s set:%d value ",pl[i].getName(),test->isSet(pl[i])); + const char *xx = test->getCString(pl[i]); + if (xx != 0) + { + fprintf(f, "%s\n",xx); + } + else + { + fprintf(f, " is empty \n"); + } + } + else { + fprintf(f,"%s set: %d value:", pl[i].getName(),test->isSet(pl[i])); + DataObjectPtr xy = test->getDataObject(pl[i]); + if (xy != 0) + { + fprintf(f, " is not empty\n"); + } + else + { + fprintf(f, " is empty \n"); + } + } + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << " WRONG - got not set exception" << endl; + return 0; + } + } + test->setBoolean("boolean", false); + test->setByte("byte",0); + test->setCharacter("character",0); + test->setShort("short",0); + test->setInteger("long",0); + test->setLong("longlong",0 ); + test->setFloat("float",0); + test->setDouble("longdouble",0 ); + test->setDate("date",0 ); + test->setString("string",0,0); + test->setBytes("bytes","",0) ; + test->setDataObject("object",0) ; + + + + fprintf(f, "Should now have all properties set, and zero values...\n"); + for (i=0;i<pl.size(); i++) + { + if (pl[i].isMany())continue; + if (pl[i].getType().isDataType()) { + fprintf(f, "%s set:%d value:%s\n", pl[i].getName(),test->isSet(pl[i]),test->getCString(pl[i])); + } + else { + fprintf(f,"%s set:%d dataobject\n", pl[i].getName(),test->isSet(pl[i])); + } + + } + + for (i=0;i<pl.size(); i++) + { + test->unset(pl[i]); + } + fprintf(f, "Should be back to having properties unset, and default values...\n"); + for (i=0;i<pl.size(); i++) + { + + try { + if (pl[i].isMany())continue; + if (pl[i].getType().isDataType()) { + fprintf(f, "%s set:%d value:",pl[i].getName(),test->isSet(pl[i])); + const char *xx = test->getCString(pl[i]); + if (xx != 0) + { + fprintf(f, "%s\n", xx); + } + else + { + fprintf(f, " is empty \n"); + } + } + else { + fprintf(f, "%s set: %d dataobject", pl[i].getName(),test->isSet(pl[i])); + DataObjectPtr dp = test->getDataObject(pl[i]); + if (dp != 0) + { + fprintf(f, " is not empty\n"); + } + else + { + fprintf(f, " is empty \n"); + } + } + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << "WRONG - not set exception" << endl; + return 0; + } + } + + SequencePtr s = test->getSequence(); + + s->addBoolean(test->getType().getProperty("boolean")/*"boolean"*/, false); + s->addByte(1/*"byte"*/,0); + s->addCharacter(2/*"character"*/,0); + s->addShort(3/*"short"*/,0); + s->addInteger(4/*"long"*/,0); + s->addLong(5/*"longlong"*/,0 ); + s->addFloat(6/*"float"*/,0); + s->addDouble(7/*"longdouble"*/,0 ); + // bug ...s->setDate(8/*"date"*/,0 ); + s->addString(9/*"string"*/,0,0); + s->addBytes(10/*"bytes"*/,"",0) ; + s->addDataObject(11/*"object"*/,0) ; + + for (i=0;i<pl.size(); i++) + { + try { + if (pl[i].isMany())continue; + if (pl[i].getType().isDataType()) { + fprintf(f, "%s set:%d value:", pl[i].getName(),test->isSet(pl[i])); + const char* xx = test->getCString(pl[i]); + if ( xx != 0) + { + fprintf(f, "%s\n", xx); + } + else + { + fprintf(f, " is empty \n"); + } + } + else { + fprintf(f, "%s set:%d dataobject", pl[i].getName(),test->isSet(pl[i])); + DataObjectPtr db = test->getDataObject(pl[i]); + if (db != 0) + { + fprintf(f, "\n"); + } + else + { + fprintf(f, " is empty \n"); + } + } + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << "WRONG - not set exception " << endl; + return 0; + } + } + ChangedDataObjectList& cl = cs->getChangedDataObjects(); + for ( i =0; i< cl.size() ; i++) + { + if (cs->isCreated(cl[i])) { + fprintf(f, "Created dataobject\n"); + } + if (cs->isDeleted(cl[i])) { + fprintf(f, "Deleted dataobject\n"); + } + if (cs->isModified(cl[i])) { + fprintf(f, "Modified dataobject\n"); + } + } + + // now unset all the properties... + for (i=0;i<pl.size(); i++) + { + test->unset(pl[i]); + } + + for (i=0;i<pl.size(); i++) + { + if (!pl[i].isMany() ) + { + test->setNull(i); + } + } + + fprintf(f, "Should all be null, and default values...\n"); + for (i=0;i<pl.size(); i++) + { + if (pl[i].isMany())continue; + if (pl[i].getType().isDataType()) { + // check for a null first!! + fprintf(f, "%s isNull:%d set:%d value:",pl[i].getName(), + test->isNull(i),test->isSet(pl[i])); + if (test->getCString(pl[i]) == 0) fprintf(f, "\n"); + else fprintf(f, "%s\n", test->getCString(pl[i])); + } + else { + fprintf(f, "%s isNull:%d set:%d value",pl[i].getName(), + test->isNull(i),test->isSet(pl[i])); + if (test->getDataObject(pl[i]) == 0) fprintf(f, " empty\n"); + else fprintf(f, " dataobject\n"); + } + } + + s->addBoolean(test->getType().getProperty("boolean")/*"boolean"*/, true); + s->addByte(1/*"byte"*/,1); + s->addCharacter(2/*"character"*/,1); + s->addShort(3/*"short"*/,1); + s->addInteger(4/*"long"*/,1); + s->addLong(5/*"longlong"*/,1 ); + s->addFloat(6/*"float"*/,1.0); + s->addDouble(7/*"longdouble"*/,1.0 ); + // bug ...s->setDate(8/*"date"*/,0 ); + wchar_t* chs = new wchar_t[5]; + chs[0] = 'h'; + chs[1] = 'e'; + chs[2] = 'l'; + chs[3] = 'l'; + chs[4] = 'o'; + s->addString(9/*"string"*/,chs,5); + delete chs; + s->addBytes(10/*"bytes"*/,"hello",5) ; + s->addDataObject(11/*"object"*/,ob) ; + + fprintf(f, "Should all have values, and not be null..\n"); + for (i=0;i<pl.size(); i++) + { + + if (pl[i].isMany())continue; + if (pl[i].getType().isDataType()) { + fprintf(f, "%s isNull:%d set:%d value:",pl[i].getName(), + test->isNull(i),test->isSet(pl[i])); + if (test->getCString(pl[i]) == 0) fprintf(f, "\n"); + else fprintf(f, "%s\n", test->getCString(pl[i])); + + } + else { + fprintf(f, "%s isNull%d set:%d value:", pl[i].getName(), + test->isNull(i),test->isSet(pl[i])); + if (test->getDataObject(pl[i]) == 0) fprintf(f, " empty\n"); + else fprintf(f, " dataobject\n"); + } + } + + for (i=0;i<pl.size(); i++) + { + if (!pl[i].isMany() ) + { + test->setNull(pl[i]); + } + } + + fprintf(f, "Should all be null, and default values...\n"); + for (i=0;i<pl.size(); i++) + { + + try { + if (pl[i].isMany())continue; + if (pl[i].getType().isDataType()) { + fprintf(f, "%s isNull:%d set:%d value:",pl[i].getName(), + test->isNull(i),test->isSet(pl[i])); + if (test->getCString(pl[i]) == 0) fprintf(f, "\n"); + else fprintf(f, "%s\n",test->getCString(pl[i])); + + } + else { + fprintf(f, "%s isNull;%d set:%d value:", pl[i].getName(), + test->isNull(i),test->isSet(pl[i])); + if (test->getDataObject(pl[i]) == 0) fprintf(f," empty\n"); + else fprintf(f, " dataobject\n"); + } + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << " WRONG - not set exception" << endl; + return 0; + } + } + + cs->endLogging(); + fclose(f); + + int rr = comparefiles("nulltest.dat","nulltest.txt"); + + if (rr == 0) + { + if (!silent) cout << "Nulltest compare failed - probably because of differences is formats for doubles/floats" << endl; + // accept the test. + return 1; + + } + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent) cout << "Nulltest failed " << e << endl; + if (f) fclose(f); + return 0; + } +} + +int sdotest::maintest() +{ + + int i; + + FILE *f; + + try{ + + f = fopen("maintest.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Failed to open maintest.dat" << endl; + } + + fprintf(f,"Test Program starting to create types ...\n"); + + /* First create a DataFactory , then add some types and props...*/ + + /* This is dms creation of metadata */ + + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Department"); + // manager is a sequenced type... + mdg->addType("myspace","Manager", true, false); + + mdg->addType("myspace","Employee"); + + // tests of base types + + // note - base type of a seq type must be seq... + mdg->addType("myspace","Person", true, false); + + mdg->addType("myspace","DerivedString"); + mdg->addType("myspace","SubDepartment"); + + /* Now add the properties to the types...*/ + + const Type& tc = mdg->getType("myspace","Company"); + const Type& ts = mdg->getType("commonj.sdo","String"); + const Type& ti = mdg->getType("commonj.sdo","Integer"); + const Type& tf = mdg->getType("commonj.sdo","Float"); + const Type& tm = mdg->getType("myspace","Manager"); + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + const Type& td = mdg->getType("myspace","Department"); + const Type& te = mdg->getType("myspace","Employee"); + const Type& tp = mdg->getType("myspace","Person"); + const Type& tds= mdg->getType("myspace","DerivedString"); + const Type& tsd= mdg->getType("myspace","SubDepartment"); + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + + + + + /* By type, with a type */ + mdg->addPropertyToType(tc,"name",ts); + + /* by name/uri with a type */ + mdg->addPropertyToType("myspace","Company","address",ts); + + /* by type with name/uri */ + mdg->addPropertyToType(tc,"departments", "myspace","Department", + true); + + + // add a reference to employee of the month + mdg->addPropertyToType(tc,"employee of the month", "myspace","Employee", + false, false, false); + + + + /* A list of floats */ + + mdg->addPropertyToType(tc,"floatlist", tf,true); + + mdg->addPropertyToType(tc,"pdg", tm); + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + mdg->addPropertyToType(td,"name", ts); + + mdg->addPropertyToType(td,"id", ti); + + mdg->addPropertyToType(td,"manager", tm); + + mdg->addPropertyToType(tm,"name", ts); + + + mdg->addPropertyToType(te,"name",ts); + mdg->addPropertyToType(td,"employees",te,true,false,true); + + + + // emps and managers are both people (in theory). + mdg->setBaseType(te,tp); + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + mdg->setBaseType(tm,tp); + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + mdg->addPropertyToType(tp,"haircolour", ts); + mdg->addPropertyToType(tp,"name", ts); + mdg->addPropertyToType(tm,"officeid", ts); + mdg->addPropertyToType(te,"cubelocation", ts); + + mdg->addPropertyToType(tc,"shareholder", tp); + + //derived string - derived from string - cannot have properties!!! + mdg->setBaseType(tds,ts); + + // subdept derived from dept + mdg->setBaseType(tsd,td); + mdg->addPropertyToType(tsd,"subname",ts); + + mdg->addPropertyToType(tc, "substring",tds); + + /* by type with name/uri */ + mdg->addPropertyToType(tc,"subdepartments", "myspace","SubDepartment", + true); + + /* This is the data structure */ + + + + /* company + ----shareholder (Person) + ----substring (DerivedString) + * ----name (String) + * ----pdg (Manager) + (inherits haircolour from person, + has name as duplicate property - should use person.name + has officeid) + * ----name(String) + ----haircolour(String) + ----officeid(String) + * + * ----depts[] (Department) + * ----name (String) + * ----id (Integer) + * ----manager (Manager). + * ----name(String) + ----haircolour(String) from Person + * ----employees[] (Employee) + * ----name(String) + ----haircolour(String) - from Person + ----cubelocation(String) + --subdepartments[] (SubDepartment) + ----name (String) from Department + ----id (String) from Department + ----manager (Manager) from Department + ----employees (from department) + */ + + /* Now add a primitive type test to the manager */ + mdg->addPropertyToType(tm,"string",ts); + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + mdg->addPropertyToType(tm,"boolean", "commonj.sdo","Boolean"); + mdg->addPropertyToType(tm,"byte", "commonj.sdo","Byte"); + mdg->addPropertyToType(tm,"character", "commonj.sdo","Character"); + mdg->addPropertyToType(tm,"short", "commonj.sdo","Short"); + mdg->addPropertyToType(tm,"long", "commonj.sdo","Integer"); + mdg->addPropertyToType(tm,"longlong", "commonj.sdo","Long"); + mdg->addPropertyToType(tm,"float", "commonj.sdo","Float"); + mdg->addPropertyToType(tm,"longdouble", "commonj.sdo","Double"); + mdg->addPropertyToType(tm,"date", "commonj.sdo","Date"); + // dead mdg->addPropertyToType(tm,"charptr", "commonj.sdo","Bytes"); + mdg->addPropertyToType(tm,"string", "commonj.sdo","String"); + mdg->addPropertyToType(tm,"bytes", "commonj.sdo","Bytes"); + + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + // create a few aliases + + mdg->setAlias("myspace","Company","TheFirm"); + mdg->setAlias("myspace","Company","departments","TheDepartments"); + mdg->setAlias("myspace","Company","TheBigFirm"); + mdg->setAlias("myspace","Company","TheLittleFirm"); + + const Type& tlf = mdg->getType("myspace","TheBigFirm"); + + fprintf(f, "Should be Company :%s\n", tlf.getName()); + + fprintf(f, "Should be 3: %d\n", tlf.getAliasCount()); + + for (int ai = 0; ai < tlf.getAliasCount(); ai++) + { + fprintf(f, "Alias: %s\n",tlf.getAlias(ai)); + } + + + // Change summary test begins + mdg->addPropertyToType(tc,"csumm","commonj.sdo","ChangeSummary"); + // should log an error - but not fail + mdg->addPropertyToType(td,"csumm","commonj.sdo","ChangeSummary"); + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + fprintf(f, "BEFORE RESOLUTION\n"); + printDataStructure(f, mdg); + + /* Now create some objects in the dg */ + +// DataObjectPtr dor; + + const Type& tcc = mdg->getType("myspace","Company"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + fprintf(f, "AFTER RESOLUTION\n"); + printDataStructure(f, mdg); + + fprintf(f, "Manager is sequenced?%d\n",tm.isSequencedType()); + + dor->setCString("substring","This is the sub string - its primitive, but not a string"); + + const char* subby = dor->getCString("substring"); + + fprintf(f, "%s\n", subby); + + dor->setCString("name","acmecorp"); + const char* chnam = dor->getCString("name"); + fprintf(f, "%s\n", chnam); + + dor->unset("name"); + + dor->setCString("name","acmecorp"); + + // Set up the two departments before logging starts + + DataObjectPtr dep1 = dor->createDataObject("departments"); + dep1->setCString("name","Developement"); + + DataObjectPtr dep2= dor->createDataObject("departments"); + dep2->setCString("name","Marketing"); + + // add a couple of floats to the floatlist + DataObjectList& dolist = dor->getList("floatlist"); + dolist.append((float)1.4); + dolist.append((float)1.5); + + //TODO - change summaries should live on the DataObject + // interface - can this be done? + + ChangeSummaryPtr cs = dor->getChangeSummary(); + cs->beginLogging(); + + const char* sname = dor->getCString("name"); + + fprintf(f, "%s\n", sname); + + // This should put a created entry in the cs. + + // This should be equivalent to the alternative below......... + const Type& tcd = mdg->getType("myspace","Manager"); + DataObjectPtr pdg = mdg->create((Type&)tcd); + + // This set should put the entry into the change summary. + // both in the creations and in the changes. + dor->setDataObject("pdg",pdg); + + + // try getting the boolean as a string - should be defaulted to false: + const char *bol; + try{ + bol = pdg->getCString("boolean"); + if (bol != 0) + { + fprintf(f, "Expected default boolean (false) : %s\n",bol); + } + else + { + fprintf(f, " is empty \n"); + } + } + catch (SDOPropertyNotSetException) + { + if (!silent)cout << "WRONG handled notset exception " << endl; + fclose(f); + return 0; + } + + pdg->setBoolean("boolean", true); + bol = pdg->getCString("boolean"); + fprintf(f, "Expected boolean (true) : %s\n",bol); + + // and the widechars? + const char* wdc; + try { + wdc = pdg->getCString("string"); + if (wdc != 0) + { + fprintf(f, "Expected default string (0) : ",wdc); + } + else + { + fprintf(f, " is empty \n"); + } + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << "WRONG handled notset exception" <<endl; + fclose (f); + return 0; + } + + + // this should get a valid sequence.. + + SequencePtr sq = pdg->getSequence(); + + + // The alternative............................................. + // Here the create should put the entry into the change summary + //DataObject* pdg = dor->createDataObject("pdg"); + + // This should do nothing to the cs, as its in a created object + pdg->setCString("name","Jacques LePlace"); + + // This should modify the property, and add an item to the sequence. + sq->addCString("name", "Jacques LePlagne"); + + + // The creation entry should be removed from the change summary + // The entry should no longer exist and the pointer is invalid + pdg->detach(); + + pdg = dor->getDataObject("pdg"); + + if (pdg != 0) + { + fprintf(f, " A deleted data object should be zero and was not\n"); + } + + pdg = mdg->create((Type&)tcd); + + // A new creation in the change summary + dor->setDataObject("pdg",pdg); + + // No modification as the object is created + pdg->setCString("name", "Mr Horace Walker"); + + sq = pdg->getSequence(); + + try { + // element 0 is the first setting - which we just deleted! + sq->setCStringValue(0,"Unable to set"); + } + catch (SDOIndexOutOfRangeException) + { + // thats OK + sq->addCString("name","Now able to set"); + } + + + sq->addText(" - should say now able to set\n"); + + for (int ii=0;ii<sq->size();ii++) + { + fprintf(f, "%s\n", sq->getCStringValue(ii)); + } + + try { + const char* n = pdg->getCString("name"); + fprintf(f, " Name from deleted item: %s\n",n); + } + catch (SDOPropertyNotFoundException e) + { + // thats ok + fprintf(f, "Correctly caught prop not found\n"); + } + + + // This should put a change in the cs. + dor->setCString("name","mega-new-acmecorp"); + + + // At this point, we should know that pdg was empty and is now + // a created object. And that the old string for company name + // was "acmecorp" + + // cs->DebugPrint(); + + + /* Now set up the primitive type test on PDG */ + + pdg->setCString("string","Hello I am a string"); + pdg->setBoolean("boolean",true); + pdg->setByte("byte",23); + pdg->setCharacter("character",45); + pdg->setShort("short",34); + pdg->setLong("long", 56); + pdg->setDouble("longdouble",89.0); + pdg->setFloat("float",90.0); + pdg->setDate("date",(time_t)200); + + // RHEL 4 has problems processing 64 bit integer constants, so we'll do it the hard way + // This is overkill but gives the option to vary the value a bit. + + int64_t largeInt1 = 0xFFFF; + int64_t largeInt2 = 0x7FFF; + for (int j = 0; j < 3; j++) + { + largeInt1 <<= 16; + largeInt1 += 0xFFFF; + largeInt2 <<= 16; + largeInt2 += 0xFFFF; + } + + pdg->setLong("longlong", largeInt1); + + // try reading the longlong as a string + const char *lls = pdg->getCString("longlong"); + fprintf(f, "0xffffffffffffffff = : %s\n", lls); + + pdg->setLong("longlong", largeInt2); + + lls = pdg->getCString("longlong"); + fprintf(f, "0x7fffffffffffffff = %s\n",lls); + + pdg->setLong("longlong",0x7FFFFFFF); + lls = pdg->getCString("longlong"); + fprintf(f, "0x7fffffff = %s\n",lls); + + pdg->setLong("longlong",0x80000000); + lls = pdg->getCString("longlong"); + fprintf(f, "0x80000000 = %s\n",lls); + + pdg->setLong("longlong",78); + + + wchar_t* wide = new wchar_t[4]; + wide[0] = 'W'; + wide[1] = 'i'; + wide[2] = 'd'; + wide[3] = 'e'; + + pdg->setString("string",wide,4); + + // and as a string? + wdc = pdg->getCString("string"); + fprintf(f, " Expected Wide - got : %s\n",wdc); + + delete wide; + + char* thin = new char[4]; + thin[0] = 'T'; + thin[1] = 'h'; + thin[2] = 'i'; + thin[3] = 'n'; + + pdg->setBytes("bytes",thin,4); + + const char* dc = pdg->getCString("bytes"); + fprintf(f, " Expected Thin - got : %s\n",dc); + + delete thin; + + const char* ps = pdg->getCString("string"); + fprintf(f, "Expecting string, got %s\n", ps); + + bool pb = pdg->getBoolean("boolean"); + fprintf(f, "Expected bool true, got %d\n",pb); + + char pc = pdg->getByte("byte"); + fprintf(f, "Expected char 23, got %d\n",pc); + + wchar_t pw = pdg->getCharacter("character"); + fprintf(f, "expected wchar 45, got %d",pw); + + short pss = pdg->getShort("short"); + fprintf(f, "Expected short 34, got %d\n",pss); + + long pl = pdg->getLong("long"); + fprintf(f, "Expected long 56 , got %ld\n",pl); + + int64_t pi = pdg->getLong("longlong"); + fprintf(f, "Expected long long 78, got %ld\n",(long)pi); + + long double ld = pdg->getDouble("longdouble"); + fprintf(f, "Expected long double 89, got %.3f\n",(float)ld); + + float pf = pdg->getFloat("float"); + fprintf(f, "Expected float 90, got %.3f\n",pf); + + SDODate pt = pdg->getDate("date"); + fprintf(f, "Expected time_t 200, got %d\n",pt.getTime()); + + + wchar_t* result; + // get the length to allocate: + unsigned int widelen = pdg->getString("string",0,0); + if (widelen > 0) { + result = new wchar_t[widelen]; + widelen = pdg->getString("string",result,widelen); + for ( i=0;i<widelen;i++) + { + fprintf(f, "Wide[%d]=%d\n",i,result[i]); + } + delete result; + } + + + char* thinresult; + + unsigned int thinlen = pdg->getBytes("bytes",0,0); + if (thinlen > 0) { + thinresult = new char[thinlen]; + thinlen = pdg->getBytes("bytes",thinresult,thinlen); + for ( i=0;i<thinlen;i++) + { + fprintf(f, "Thin[%d]=%d\n",i,thinresult[i]); + } + delete thinresult; + } + + + // add two more departments - the first should provoke the + // saving of a list in a change summary + + DataObjectPtr dep3 = dor->createDataObject("departments"); + dep3->setCString("name","Architecture"); + + // The second should do no logging in the change summary + + DataObjectPtr dep4= dor->createDataObject("departments"); + dep4->setCString("name","Pyrotechnics"); + + + // create another one using tha alias + DataObjectPtr dep5= dor->createDataObject("TheDepartments"); + dep5->setCString("name","Accounts"); + + DataObjectPtr emp1 = dep1->createDataObject("employees"); + emp1->setCString("name","Eric"); + + + DataObjectPtr emp2 = dep1->createDataObject("employees"); + emp2->setCString("name","Bill"); + + // now lets make eric employee of the month + dor->setDataObject("employee of the month",emp1); + + // no - actually it was bill + dor->setDataObject("employee of the month",emp2); + + + + // Now add to the list of floats, hopefully the two old + // values will get change summarised. + + dolist = dor->getList("floatlist"); + float f1 = dolist.getFloat(0); + + fprintf(f, "%.3f",f1); + + dolist.setFloat(0,(float)567.7); + + f1 = dolist.getFloat(0); + + fprintf(f, "%.3f",f1); + + dolist.insert(0,(float)34.56); + + + DataObjectPtr ddd = dor->getDataObject("departments[1]/employees[2]"); + + const char* ch = ddd->getCString("name"); + + fprintf(f, "Should be Bill:%s\n",ch); + + + DataObjectPtr ddd2 = dor->getDataObject("TheDepartments[1]/employees[2]"); + + const char* ch2 = ddd2->getCString("name"); + + fprintf(f, "Should be Bill:%s\n",ch2); + + + DataObjectPtr dempofm = dor->getDataObject("employee of the month"); + + const char* chh = dempofm->getCString("name"); + + fprintf(f, "The employee of the month is %s\n",chh); + + // Suppose we delete bill + + DataObjectList& dlo = dor->getList("departments[1]/employees"); + DataObjectPtr fred = dlo.remove(1); + + const char* chh2 = fred->getCString("name"); + + dempofm = dor->getDataObject("employee of the month"); + + // uncertain bahaviour - should the reference be zeroed + // becuase the item is removed from a list or not? + // Right now it doesnt get done, as the assumption is that + // the object will be put somewhere else, or dropped. + // fprintf(f, "Emp of month is now zero : %p",dempofm); + + + /* "The client would create a data mediator and get graph which + would return the root data object " */ + + const char* boss = dor->getCString("pdg/name"); + + fprintf(f, "%s\n", boss); + + DataObjectPtr mypdg = dor->getDataObject("pdg"); + + Type::Types t = mypdg->getTypeEnum(); + + if (t != Type::OtherTypes) { + fprintf(f, "pdg correctly identified\n"); + } + + const char* boss2 = mypdg->getCString("name"); + + fprintf(f, "%s\n", boss2); + + /* getPrimitiveArrayListVectorThingy() */ + + DataObjectList& deps = dor->getList("departments"); + + fprintf(f, "size of list %d\n",deps.size()); + + DataObjectPtr dout = deps[0]; + + dout->setCString("name","Research And Development"); + + const char* snew = dout->getCString("name"); + + fprintf(f, "%s\n", snew); + + string snew2 = dor->getCString("departments[1 ] /name"); + + fprintf(f, "%s\n", snew2.c_str()); + + for (int lx = 0; lx < deps.size(); lx++) + { + fprintf(f, "Department: %s\n",deps[lx]->getCString("name")); + } + + cs->endLogging(); + + + try { + // should fail - if localtype not set + dor->setCString("departments","department label"); + const char* slabel = dor->getCString("departments"); + fprintf(f, "String in list type:%s\n", slabel); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f, "Normal expected exception\n"); + } + + try + { + const char* snew3 = dor->getCString(" ]awep50wi4,0qw9q]45]# q2345 -t -v3lt6o -56o 56=-o7nl ewv/;sdl f[vxddglh]px dfju/ g#k./jh#.k./"); + fprintf(f, "%s\n", snew3); + return 0; + } + catch (SDOPropertyNotFoundException e) + { + fprintf(f, "Normal Invalid path exception\n"); + } + + try + { + + // catch a and a property not found + const Property& pp = dor->getType().getProperty("notaproperty"); + return 0; + } + catch (SDOPropertyNotFoundException e) + { + fprintf(f, "Normal SDOPropertyNotFound exception\n"); + } + fclose(f); + return comparefiles("maintest.dat","maintest.txt"); + + } + + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << " in "; + if (!silent) cout << e.getFileName() << " at line "; + if (!silent) cout << e.getLineNumber() << endl; + if (!silent) cout << e.getFunctionName() << " "; + if (!silent) cout << e.getSeverity() << " "; + if (!silent) cout << e.getMessageText() << endl; + return 0; + } +} + +int sdotest::getproptest() +{ + // should be able to get a property by xpath... + + FILE *f; + + f = fopen("getproptest.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open getproptest.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Department"); + // manager is a sequenced type... + mdg->addType("myspace","Manager", true, false); + mdg->addType("myspace","Employee"); + + + /* Now add the properties to the types...*/ + + const Type& tc = mdg->getType("myspace","Company"); + const Type& ts = mdg->getType("commonj.sdo","String"); + const Type& ti = mdg->getType("commonj.sdo","Integer"); + const Type& tf = mdg->getType("commonj.sdo","Float"); + const Type& tm = mdg->getType("myspace","Manager"); + const Type& td = mdg->getType("myspace","Department"); + const Type& te = mdg->getType("myspace","Employee"); + + mdg->addPropertyToType(tc,"name",ts); + + mdg->addPropertyToType(tc,"address",ts); + + mdg->addPropertyToType(tc,"departments", td,true); + + // add a reference to employee of the month + mdg->addPropertyToType(tc,"employee of the month", te, false, false, false); + + /* A list of floats */ + mdg->addPropertyToType(tc,"floatlist", tf,true); + mdg->addPropertyToType(tc,"director", tm); + + mdg->addPropertyToType(td,"name", ts); + mdg->addPropertyToType(td,"id", ti); + + mdg->addPropertyToType(td,"manager", tm); + mdg->addPropertyToType(tm,"name", ts); + + mdg->addPropertyToType(te,"name",ts); + mdg->addPropertyToType(td,"employees",te,true,false,true); + + //company/departments/employees. + // company - name, address, floatlist + // department name, id, manager + // employee name + + + const Type& tcc = mdg->getType("myspace","Company"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + + const Property& p = dor->getType().getProperty("name"); + fprintf(f, "Companys name property is: %s\n",p.getName()); + + const Property& p1 = dor->getType().getProperty("departments"); + fprintf(f, "Companys dept property is:%s\n",p1.getName()); + + // now try some xpaths... + + try { + + const Property& p2 = dor->getType().getProperty("departments/employees"); + fprintf(f,"Departments empl property is:%s\n",p2.getName()); + + const Property& p3 = dor->getType().getProperty("departments[456]/employees[123]"); + fprintf(f,"Departments empl property is:%s\n", p3.getName()); + + const Property& p4 = dor->getType().getProperty("departments.34/employees.123/name"); + fprintf(f,"Employees name property is:%s\n", p4.getName()); + + } + catch (SDORuntimeException e) + { + if (!silent) cout <<"Exceptions - xpath didnt work" << endl; + return 0; + } + try { + const Property& p5 = dor->getType().getProperty("departments.34/[]/name"); + fprintf(f,"Employees name property is:%s\n",p5.getName()); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f,"Normal exception caught\n"); + } + + try { + const Property& p6 = dor->getType().getProperty("deptartments"); + fprintf(f,"Deptartments property is:%s\n",p6.getName()); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f,"Normal exception caught\n"); + } + + try { + const Property& p7 = dor->getType().getProperty("../company"); + fprintf(f,"Company property is:%s\n",p7.getName()); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f,"Normal exception caught\n"); + } + fclose (f); + return comparefiles("getproptest.dat","getproptest.txt"); + +} + +int sdotest::querytest() +{ + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + FILE *f = fopen("querytest.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open querytest.dat" << endl; + return 0; + } + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Department"); + // manager is a sequenced type... + mdg->addType("myspace","Manager", true, false); + mdg->addType("myspace","Employee"); + + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool= mdg->getType("commonj.sdo","Boolean"); + const Type& tbyte= mdg->getType("commonj.sdo","Byte"); + const Type& tchar= mdg->getType("commonj.sdo","Character"); + const Type& tint= mdg->getType("commonj.sdo","Integer"); + const Type& tlong= mdg->getType("commonj.sdo","Long"); + const Type& tfloat= mdg->getType("commonj.sdo","Float"); + const Type& tbytes = mdg->getType("commonj.sdo","Bytes"); + const Type& tdouble= mdg->getType("commonj.sdo","Double"); + + const Type& tc = mdg->getType("myspace","Company"); + const Type& tm = mdg->getType("myspace","Manager"); + const Type& td = mdg->getType("myspace","Department"); + const Type& te = mdg->getType("myspace","Employee"); + + mdg->addPropertyToType(tc,"name",tstring); + + mdg->addPropertyToType(tc,"departments", td,true); + + // add a reference to employee of the month + mdg->addPropertyToType(tc,"employee of the month", te, false, false, false); + + mdg->addPropertyToType(tc,"director", tm); + + mdg->addPropertyToType(td,"name", tstring); + + mdg->addPropertyToType(td,"manager", tm); + + mdg->addPropertyToType(tm,"name", tstring); + + + mdg->addPropertyToType(td,"employees",te,true,false,true); + + mdg->addPropertyToType(te,"bool",tbool); + mdg->addPropertyToType(te,"byte",tbyte); + mdg->addPropertyToType(te,"char",tchar); + mdg->addPropertyToType(te,"int",tint); + mdg->addPropertyToType(te,"float",tfloat); + mdg->addPropertyToType(te,"long",tlong); + mdg->addPropertyToType(te,"double",tdouble); + mdg->addPropertyToType(te,"bytes",tbytes); + mdg->addPropertyToType(te,"string",tstring); + mdg->addPropertyToType(te,"name",tstring); + + //company/departments/employees. + // company - name, address, floatlist + // department name, id, manager + // employee name + + const Type& tcc = mdg->getType("myspace","Company"); + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectPtr dept = dor->createDataObject("departments"); + + DataObjectPtr emp1 = dept->createDataObject("employees"); + DataObjectPtr emp2 = dept->createDataObject("employees"); + DataObjectPtr emp3 = dept->createDataObject("employees"); + + emp1->setCString("name","Employee1"); + emp2->setCString("name","Employee2"); + emp3->setCString("name","Employee3"); + + + emp1->setBoolean("bool",true); + emp1->setByte("byte",'1'); + emp1->setCharacter("char",'1'); + emp1->setInteger("int",1); + emp1->setFloat("float",1.0); + emp1->setLong("long",1); + emp1->setDouble("double",1.0); + + char* bytes = new char[6]; + bytes[0] = 'h'; + bytes[1] = 'e'; + bytes[2] = 'l'; + bytes[3] = 'l'; + bytes[4] = 'o'; + + emp1->setBytes("bytes",bytes,5); + + wchar_t* mbytes = new wchar_t[6]; + mbytes[0] = 'h'; + mbytes[1] = 'e'; + mbytes[2] = 'l'; + mbytes[3] = 'l'; + mbytes[4] = 'o'; + + emp1->setString("string",mbytes,5); + + + emp2->setBoolean("bool",true); + emp2->setByte("byte",'2'); + emp2->setCharacter("char",'2'); + emp2->setInteger("int",200); + emp2->setFloat("float",200.0); + emp2->setLong("long",200); + emp2->setDouble("double",200.0); + + char* bytes2 = new char[6]; + bytes2[0] = 'h'; + bytes2[1] = 'e'; + bytes2[2] = 'l'; + bytes2[3] = 'p'; + bytes2[4] = '!'; + + emp2->setBytes("bytes",bytes2,5); + + wchar_t* mbytes2 = new wchar_t[6]; + mbytes2[0] = 'h'; + mbytes2[1] = 'e'; + mbytes2[2] = 'l'; + mbytes2[3] = 'p'; + mbytes2[4] = '!'; + + emp2->setString("string",mbytes2,5); + + emp3->setBoolean("bool",false); + emp3->setByte("byte",'4'); + emp3->setCharacter("char",'4'); + emp3->setInteger("int",400); + emp3->setFloat("float",400.0); + emp3->setLong("long",400); + emp3->setDouble("double",400.0); + + char* bytes3 = new char[6]; + bytes3[0] = 'w'; + bytes3[1] = 'o'; + bytes3[2] = 'm'; + bytes3[3] = 'p'; + bytes3[4] = '!'; + + emp3->setBytes("bytes",bytes3,5); + + wchar_t* mbytes3 = new wchar_t[6]; + mbytes3[0] = 'w'; + mbytes3[1] = 'o'; + mbytes3[2] = 'm'; + mbytes3[3] = 'p'; + mbytes3[4] = '!'; + + emp3->setString("string",mbytes3,5); + + + + try { + DataObjectPtr dob1 = dor->getDataObject("departments[1]/employees[bool=false]"); + fprintf(f, "Expected employee3: got %s\n",dob1->getCString("name")); + + DataObjectPtr dob2 = dor->getDataObject("departments[1]/employees[bool=true]"); + fprintf(f, "Expected employee1: got %s\n",dob2->getCString("name")); + + DataObjectPtr dob3 = dor->getDataObject("departments[1]/employees[byte=2]"); + fprintf(f, "Expected employee2: got %s\n",dob3->getCString("name")); + + DataObjectPtr dob4 = dor->getDataObject("departments[1]/employees[byte=1]"); + fprintf(f, "Expected employee1: got %s\n",dob4->getCString("name")); + + DataObjectPtr dob5 = dor->getDataObject("departments[1]/employees[bytes=hello]"); + fprintf(f, "Expected employee1: got %s\n",dob5->getCString("name")); + + DataObjectPtr dob5a = dor->getDataObject("departments[1]/employees[bytes=\"hello\"]"); + fprintf(f, "Expected employee1: got %s\n",dob5a->getCString("name")); + + DataObjectPtr dob5b = dor->getDataObject("departments[1]/employees[bytes='hello']"); + fprintf(f, "Expected employee1: got %s\n",dob5b->getCString("name")); + + DataObjectPtr dob6 = dor->getDataObject("departments[1]/employees[bytes=womp!]"); + fprintf(f, "Expected employee3: got %s\n",dob6->getCString("name")); + + DataObjectPtr dob7 = dor->getDataObject("departments[1]/employees[double=200.0]"); + fprintf(f, "Expected employee2: got %s\n",dob7->getCString("name")); + + DataObjectPtr dob8 = dor->getDataObject("departments[1]/employees[string=help!]"); + fprintf(f, "Expected employee2: got %s\n",dob8->getCString("name")); + + DataObjectPtr dob8a = dor->getDataObject("departments[1]/employees[string=\"help!\"]"); + fprintf(f, "Expected employee2: got %s\n",dob8a->getCString("name")); + + DataObjectPtr dob8b = dor->getDataObject("departments[1]/employees[string= 'help!']"); + fprintf(f, "Expected employee2: got %s\n",dob8b->getCString("name")); + } + catch (SDORuntimeException e) + { + if (!silent)cout << e.getEClassName() << " in "; + if (!silent)cout << e.getFileName() << " at line "; + if (!silent)cout << e.getLineNumber() << endl; + if (!silent)cout << e.getFunctionName() << " "; + if (!silent)cout << e.getMessageText() << endl; + return 0; + } + try { + DataObjectPtr dob1 = dor->getDataObject("departments[1]/employees[bool=doughnut]"); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f, "Normal exception caught\n"); + } + + try { + DataObjectPtr dob1 = dor->getDataObject("departments[4]/employees[bool=true]"); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f, "Normal exception caught\n"); + } + + try { + DataObjectPtr dob1 = dor->getDataObject("departments[1]/employees[bytes=whoomp!]"); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f, "Normal exception caught\n"); + } + + try { + DataObjectPtr dob1 = dor->getDataObject("departments[1]/blmployees[bool=true]"); + return 0; + } + catch (SDORuntimeException e) + { + fprintf(f, "Normal exception caught\n"); + } + + try { + DataObjectPtr dob1 = dor->getDataObject("departments[teapot]/employees[bool=true]"); + return 0; + } + + catch (SDORuntimeException e) + { + fprintf(f, "Normal exception caught\n"); + } + + delete bytes; + delete bytes2; + delete bytes3; + delete mbytes; + delete mbytes2; + delete mbytes3; + + fclose (f); + return comparefiles("querytest.dat","querytest.txt"); +} + +int sdotest::setmany() +{ + + FILE *f; + f = fopen("setmany.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open setmany.dat" << endl; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","School"); + mdg->addType("myspace","Class"); + mdg->addType("myspace","Teacher"); + mdg->addType("myspace","Child"); + mdg->addType("myspace","Address"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tint = mdg->getType("commonj.sdo","Integer"); + const Type& ts = mdg->getType("myspace","School"); + const Type& tc = mdg->getType("myspace","Class"); + const Type& tch = mdg->getType("myspace","Child"); + const Type& tt = mdg->getType("myspace","Teacher"); + const Type& ta = mdg->getType("myspace","Address"); + + mdg->addPropertyToType(tc,"name",tstring); + mdg->addPropertyToType(ts,"name",tstring); + mdg->addPropertyToType(tch,"name",tstring); + mdg->addPropertyToType(tt,"name",tstring); + + mdg->addPropertyToType(tc,"number",tint); + mdg->addPropertyToType(ts,"number",tint); + mdg->addPropertyToType(tch,"number",tint); + mdg->addPropertyToType(tt,"number",tint); + + mdg->addPropertyToType(ts,"classes", tc,true); + mdg->addPropertyToType(tc,"children", tch,true); + mdg->addPropertyToType(tc,"teacher", tt); + + mdg->addPropertyToType(tch,"address", ta); + mdg->addPropertyToType(ts,"address", ta); + mdg->addPropertyToType(tt,"address", ta); + + mdg->addPropertyToType(ta,"lines", tstring, true); + + DataObjectPtr school = mdg->create((Type&)ts); + + DataObjectPtr class1 = school->createDataObject("classes"); + DataObjectPtr class2 = school->createDataObject("classes"); + + DataObjectPtr teach1 = class1->createDataObject("teacher"); + + DataObjectPtr kid1 = class1->createDataObject("children"); + DataObjectPtr kid2 = class1->createDataObject("children"); + DataObjectPtr kid3 = class1->createDataObject("children"); + + DataObjectPtr teach2 = class2->createDataObject("teacher"); + + DataObjectPtr kid4 = class2->createDataObject("children"); + DataObjectPtr kid5 = class2->createDataObject("children"); + DataObjectPtr kid6 = class2->createDataObject("children"); + + school->setCString("name","King Norberts"); + school->createDataObject("address"); + school->setCString("address/lines.0","The Place"); + school->setCString("address/lines.1","1 The Avenue"); + school->setCString("address/lines.2","Murchester"); + school->setCString("address/lines.3","England"); + + class1->setCString("name","Primary"); + class2->setCString("name","Secondary"); + + class1->setCString("teacher/name","Mr Philbert Chloroform"); + class2->setCString("teacher/name","Mr Brian Onasis"); + + kid1->setCString("name", "Witherspoon Jnr"); + kid2->setCString("name", "Snape"); + kid3->setCString("name", "Thannet"); + kid4->setCString("name", "Grimbling"); + kid5->setCString("name", "Snagget Minor"); + kid6->setCString("name", "Van Den Bograt"); + + kid1->setInteger("number", 1); + kid2->setInteger("number", 2); + kid3->setInteger("number", 3); + kid4->setInteger("number", 4); + kid5->setInteger("number", 5); + kid6->setInteger("number", 6); + + fprintf(f," School :%s\n", school->getCString("name")); + + fprintf(f," Address1:%s\n",school->getCString("address/lines.0")); + fprintf(f," Address2:%s\n",school->getCString("address/lines.1")); + fprintf(f," Address3:%s\n",school->getCString("address/lines.2")); + fprintf(f," Address4:%s\n",school->getCString("address/lines.3")); + + fprintf(f," Class :%s\n",class1->getCString("name")); + fprintf(f," Teacher :%s\n",class1->getCString("teacher/name")); + fprintf(f," Pupil1 :%s\n",class1->getCString("children.0/name")); + fprintf(f," Pupil2 :%s\n",class1->getCString("children[number=2]/name")); + fprintf(f," Pupil3 :%s\n",class1->getCString("children[3]/name")); + + fprintf(f," Class :%s\n",class2->getCString("name")); + fprintf(f," Teacher :%s\n",class2->getCString("teacher/name")); + fprintf(f," Pupil1 :%s\n",class2->getCString("children[1]/name")); + fprintf(f," Pupil2 :%s\n",class2->getCString("children.1/name")); + fprintf(f," Pupil3 :%s\n",class2->getCString("children[number=6]/name")); + + try { + fprintf(f," Pupil3 :%s\n",class2->getCString("children[4]/name")); + return 0; + } + catch (SDOPathNotFoundException e) + { + fprintf(f,"Expected path not found exception caught\n"); + } + if (XpathHelper::isIndexed("abc[2]")) { + fprintf(f, "Indexed as expected\n"); + } + else { + fprintf(f, "Bad - not indexed\n"); + } + + if (XpathHelper::isIndexed("wibble/[2]")) { + fprintf(f, "Indexed as expected\n"); + } + else { + fprintf(f, "Bad - not indexed\n"); + } + + if (XpathHelper::isIndexed("wibble/wobble[2]")) { + fprintf(f, "Indexed as expected\n"); + } + else { + fprintf(f, "Bad - not indexed\n"); + } + + if (XpathHelper::isIndexed("wibble/wobble.2")) { + fprintf(f, "Indexed as expected\n"); + } + else { + fprintf(f, "Bad - not indexed\n"); + } + + if (XpathHelper::isIndexed("wibble/wobble.2")) { + fprintf(f, "Indexed as expected\n"); + } + else { + fprintf(f, "Bad - not indexed\n"); + } + + try { + fprintf(f," Address5 :%s\n",school->getCString("address/lines[5]")); + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + fprintf(f,"Normal index out of range caught\n"); + } + + try { + school->setCString("address/lines[6]","PostCode"); + fprintf(f, "Debatable behaviour - appended\n"); + fprintf(f," Address4 :%s\n",school->getCString("address/lines[5]")); + } + catch (SDORuntimeException e) + { + if (!silent)cout <<"Unexpected exception"<< endl; + return 0; + } + + fclose(f); + return comparefiles("setmany.dat","setmany.txt"); +} + +int sdotest::carotest2() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","root"); + + mdg->addPropertyToType("myspace","root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + const Type& troot = mdg->getType("myspace","root"); + + DataObjectPtr root = mdg->create((Type&)troot); + return 1; + } + catch (SDORuntimeException e) + { + return 0; + } +} + +int sdotest::adddeletetest() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","root"); + mdg->addType("myspace","bill"); + + mdg->addPropertyToType("myspace","root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addPropertyToType("myspace","root","bill", + "myspace","bill"); + + const Type& troot = mdg->getType("myspace","root"); + + DataObjectPtr root = mdg->create((Type&)troot); + + ChangeSummaryPtr cs = root->getChangeSummary(); + cs->beginLogging(); + DataObjectPtr dob = root->createDataObject("bill"); + root->unset("bill"); + return 1; + } + catch (SDORuntimeException e) + { + return 0; + } +} + +int sdotest::carotest() +{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","root"); + mdg->addType("myspace","company"); + mdg->addType("myspace","department"); + mdg->addType("myspace","employee"); + + mdg->addPropertyToType("myspace","root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addPropertyToType("myspace","company","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","department","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","employee","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","root","companies", + "myspace","company", true, false, true); + + mdg->addPropertyToType("myspace","company","departments", + "myspace","department", true, false, true); + + mdg->addPropertyToType("myspace","company","eotm", + "myspace","employee", false, false, false); + + mdg->addPropertyToType("myspace","department","employees", + "myspace","employee", true, false, true); + + const Type& troot = mdg->getType("myspace","root"); + + + DataObjectPtr root = mdg->create((Type&)troot); + ChangeSummaryPtr cs = root->getChangeSummary(); + + cs->beginLogging(); + + DataObjectPtr comp = root->createDataObject("companies"); + + comp->setCString("name","Acme"); + + //cout << "name of the company is " << comp->getCString("name") << endl; + try { + root->unset("companies[0]"); + return 1; + } + catch (SDOUnsupportedOperationException e) + { + if (!silent)cout << "Abnormal unsupported operation for unset of many valued item" << endl; + return 0; + } +} + + +int sdotest::bug2() +{ + + FILE *f; + + f = fopen("bug2.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open bug2.dat" << endl; + return 0; + } + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","root"); + mdg->addType("myspace","company"); + + mdg->addPropertyToType("myspace","root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addPropertyToType("myspace","company","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","root","companies", + "myspace","company", true, false, true); + + + const Type& troot = mdg->getType("myspace","root"); + + + DataObjectPtr root = mdg->create((Type&)troot); + + ChangeSummaryPtr cs = root->getChangeSummary(); + + cs->beginLogging(); + + DataObjectPtr comp = root->createDataObject("companies"); + + comp->setCString("name","Acme"); + + dumpproperties(f,root); + + DataObjectList& dl = root->getList("companies"); + dl.remove(0); + + dumpproperties(f,root); + + + fprintf(f, "Change summary should have no entries...\n"); + + dumpchangesummary(f,cs); + + dumpproperties(f,root); + + fprintf(f, "Change summary should have no entries...\n"); + + dumpchangesummary(f,cs); + + fclose(f); + return comparefiles("bug2.dat","bug2.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent) cout << e.getEClassName() << " in "; + if (!silent) cout << e.getFileName() << " at line "; + if (!silent) cout << e.getLineNumber() << endl; + if (!silent) cout << e.getFunctionName() << " "; + if (!silent) cout << e.getMessageText() << endl; + return 0; + } +} + + +int sdotest::dumpproperties(FILE *f, DataObjectPtr root) +{ + PropertyList pl = root->getInstanceProperties(); + for (int i=0;i<pl.size();i++) + { + if (pl[i].isMany()) + { + DataObjectList& dl = root->getList(pl[i]); + if (pl[i].getType().isDataType()) + { + char buf[10]; + for (int j=0;j<dl.size();j++) + { + + sprintf(buf,"%02d",j); + fprintf(f,"MProperty:%s[%s]:%s\n", + pl[i].getName(),buf,dl.getCString(j)); + } + } + else + { + fprintf(f,"MObject Property %s\n",pl[i].getName()); + for (int j=0;j<dl.size();j++) + { + if (dl[j] != 0) + { + dumpproperties(f, dl[j]); + } + } + fprintf(f,"End of MObject Property %s\n",pl[i].getName()); + } + } + + else + { + if (pl[i].getType().isDataType()) + { + fprintf(f,"Property:%s:%s\n",pl[i].getName(),root->getCString(pl[i])); + } + else + { + fprintf(f,"Object Property%s\n:",pl[i].getName()); + DataObjectPtr d = root->getDataObject(pl[i]); + if (d != 0) + { + dumpproperties(f, d); + } + else + { + fprintf(f," Value was not set or null\n"); + } + fprintf(f,"End of Object Property %s\n",pl[i].getName()); + } + } + } + return 1; +} + + +int sdotest::datetest() +{ + + try { + + FILE *f = fopen("datetest.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open datetest.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","root"); + mdg->addType("myspace","company"); + + mdg->addPropertyToType("myspace","root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addPropertyToType("myspace","company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","company","startupdate", + "commonj.sdo","Date", false, false, false); + + mdg->addPropertyToType("myspace","company","reviewdates", + "commonj.sdo","Date", true, false, false); + + + mdg->addPropertyToType("myspace","root","company", + "myspace","company", false, false, true); + + + + const Type& troot = mdg->getType("myspace","root"); + + + DataObjectPtr root = mdg->create((Type&)troot); + ChangeSummaryPtr cs = root->getChangeSummary(); + + cs->beginLogging(); + + DataObjectPtr comp = root->createDataObject("company"); + + + comp->setCString("name","DateTest"); + + fprintf(f,"Name of the company is %s\n",comp->getCString("name")); + + comp->setDate("startupdate",SDODate( 1000 )); + + fprintf(f,"Set start of the company is %d\n",comp->getDate("startupdate").getTime()); + + DataObjectList& dol = comp->getList("reviewdates"); + + dol.append(SDODate(2000)); + dol.append(SDODate(4000)); + + for (int i=0;i < dol.size(); i++) + { + fprintf(f,"Review number:%d was:%d\n", i,dol.getDate(i).getTime()); + + // ascTime gives different values on windows and linux, + // so comparison of the output is not a valid test. + + //fprintf(f,"Formatted:%d was:%s\n",i,dol.getDate(i).ascTime()); + } + + cs->endLogging(); + + fclose(f); + + return comparefiles("datetest.dat","datetest.txt"); + } + + catch (SDORuntimeException e) + { + if (!silent)cout << e.getEClassName() << " in "; + if (!silent)cout << e.getFileName() << " at line "; + if (!silent)cout << e.getLineNumber() << endl; + if (!silent)cout << e.getFunctionName() << " "; + if (!silent)cout << e.getMessageText() << endl; + return 0; + } + +} + +int sdotest::matttest1() +{ + + try { + FILE *f = fopen("matttest1.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open matttest1.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","root"); + mdg->addType("myspace","company"); + mdg->addType("myspace","department"); + mdg->addType("myspace","employee"); + + mdg->addPropertyToType("myspace","root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addPropertyToType("myspace","company","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","department","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","employee","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","root","companies", + "myspace","company", true, false, true); + + mdg->addPropertyToType("myspace","company","departments", + "myspace","department", true, false, true); + + mdg->addPropertyToType("myspace","company","eotm", + "myspace","employee", false, false, false); + + mdg->addPropertyToType("myspace","department","employees", + "myspace","employee", true, false, true); + + const Type& troot = mdg->getType("myspace","root"); + + + DataObjectPtr root = mdg->create((Type&)troot); + + DataObjectPtr comp = root->createDataObject("companies"); + + comp->setCString("name","Acme"); + + DataObjectPtr dept1 = comp->createDataObject("departments"); + + dept1->setCString("name","Shoe"); + + DataObjectPtr dept2 = comp->createDataObject("departments"); + + dept2->setCString("name","IT"); + + DataObjectPtr sue = dept1->createDataObject("employees"); + + sue->setCString("name","Sue"); + + DataObjectPtr billy = dept2->createDataObject("employees"); + + billy->setCString("name","Billy"); + + // Want to swap Sue and Billy so, while holding them in variables, should be + //able to unset from department then reinsert + + // method 1 - clear the lists... + dept1->unset("employees"); + dept2->unset("employees"); + + DataObjectPtr cont = billy->getContainer(); + + if (cont != 0) + { + if (!silent)cout << "Container of Billy should be zero, but is :" << cont->getCString("name") << endl; + return 0; + } + + DataObjectList& li1 = dept1->getList("employees"); + DataObjectList& li2 = dept2->getList("employees"); + li1.append(billy); + li2.append(sue); + + DataObjectPtr cont2 = billy->getContainer(); + + if (cont2 != 0) + { + fprintf(f,"Container of Billy should be dept1, and is :%s\n", cont2->getCString("name")); + } + else { + if (!silent)cout << "Problem - Billy is not contained." << endl; + return 0; + } + + li1.remove(0); + li2.remove(0); + + DataObjectPtr cont3 = billy->getContainer(); + + if (cont3 != 0) + { + if (!silent)cout << "Container of Billy should be zero, but is :" << cont3->getCString("name") << endl; + return 0; + } + + li1.append(sue); + li2.append(billy); + + DataObjectPtr cont4 = billy->getContainer(); + + if (cont4 != 0) + { + fprintf(f,"Container of Billy should be dept2, and is :%s\n", cont4->getCString("name")); + } + else { + if (!silent)cout << "Problem - Billy is not contained." << endl; + return 0; + } + + fclose(f); + + return comparefiles("matttest1.dat","matttest1.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << e.getEClassName() << " in "; + if (!silent)cout << e.getFileName() << " at line "; + if (!silent)cout << e.getLineNumber() << endl; + if (!silent)cout << e.getFunctionName() << " "; + if (!silent)cout << e.getMessageText() << endl; + return 0; + } +} + +int sdotest::carotest3() +{ + // sequence new APIs + // data object list, new getLength(unsigned int) + + + FILE *f = fopen("carotest3.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open carotest3.dat" << endl; + return 0; + } + DataFactoryPtr mdg = DataFactory::getDataFactory(); + // company is sequenced. + mdg->addType("myspace","Company",true,false); + + mdg->addType("myspace","Department",true,false); + // string is many + + mdg->addPropertyToType("myspace","Company","string","commonj.sdo","String", + true); + + mdg->addPropertyToType("myspace","Company","departments","myspace","Department", + true); + + mdg->addPropertyToType("myspace","Company","strings","commonj.sdo","String", + true); + + mdg->addPropertyToType("myspace","Company","integers","commonj.sdo","Integer", + true); + + + mdg->addPropertyToType("myspace","Department","name","commonj.sdo","String"); + + + const Type& tcc = mdg->getType("myspace","Company"); + + DataObjectPtr dor = mdg->create(tcc); + const Property& sprop = dor->getType().getProperty("string"); + + SequencePtr sptr = dor->getSequence(); + + printseq(f,sptr); + + sptr->addCString(sprop,"I am Item 1 of string"); + + printseq(f,sptr); + + sptr->addText("I am the first free text"); + + printseq(f,sptr); + + sptr->addCString(sprop,"I am Item 2 of string"); + + printseq(f,sptr); + + sptr->setText(1,"I am free text which has been modified"); + + printseq(f,sptr); + + DataObjectPtr dep1 = dor->createDataObject("departments"); + + printseq(f,sptr); + + dep1->setCString("name","department1"); + + printseq(f,sptr); + + DataObjectList& dol = dor->getList("departments"); + + unsigned int ii = dol.getLength(0); + + if (ii != 0) + { + if (!silent)cout << "Length of a data object should be zero:" << ii << endl; + return 0; + } + + DataObjectList& strl = dor->getList("strings"); + + wchar_t * buf = new wchar_t[5]; + buf[0] = 'a'; + buf[1] = 'b'; + buf[2] = 'c'; + buf[3] = 'd'; + buf[4] = 'e'; + + strl.append(buf,1); + strl.append(buf,2); + strl.append(buf,3); + strl.append(buf,4); + strl.append(buf,5); + + fprintf(f,"Element zero, length 1: %d\n",strl.getLength(0)); + fprintf(f,"Element one, length 2: %d\n",strl.getLength(1)); + fprintf(f,"Element two, length 3: %d\n",strl.getLength(2)); + fprintf(f,"Element three,length 4: %d\n",strl.getLength(3)); + fprintf(f,"Element four, length 5: %d\n",strl.getLength(4)); + + try { + int xx = strl.getLength(5); + if (!silent)cout << "problem - element 5 should not exist" << endl; + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + if (!silent)cout << "Normal out of range exception in test" << endl; + } + + DataObjectList& numl = dor->getList("integers"); + + try { + int xx2 = numl.getLength(0); + if (!silent)cout << "problem - element 0 should not exist" << endl; + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + if (!silent)cout << "Normal out of range exception in test" << endl; + } + fclose(f); + return comparefiles("carotest3.dat","carotest3.txt"); +} + + +int sdotest::eqhelpertest() +{ + + // copy and equality helpers + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Assembly"); + mdg->addType("myspace","SubAssembly"); + mdg->addType("myspace","Part"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tint = mdg->getType("commonj.sdo","Integer"); + const Type& tassy = mdg->getType("myspace","Assembly"); + const Type& tsubassy = mdg->getType("myspace","SubAssembly"); + const Type& tpart = mdg->getType("myspace","Part"); + + + mdg->addPropertyToType(tassy,"name",tstring); + mdg->addPropertyToType(tsubassy,"name",tstring); + mdg->addPropertyToType(tpart,"name",tstring); + + mdg->addPropertyToType(tassy,"number",tint); + mdg->addPropertyToType(tsubassy,"number",tint); + mdg->addPropertyToType(tpart,"number",tint); + + mdg->addPropertyToType(tassy,"subassemblies", tsubassy,true); + mdg->addPropertyToType(tsubassy,"parts", tpart,true); + + + // assy 1 + + DataObjectPtr assy1 = mdg->create((Type&)tassy); + + DataObjectPtr subassy1 = assy1->createDataObject("subassemblies"); + DataObjectPtr subassy2 = assy1->createDataObject("subassemblies"); + + DataObjectPtr part1 = subassy1->createDataObject("parts"); + DataObjectPtr part2 = subassy1->createDataObject("parts"); + DataObjectPtr part3 = subassy1->createDataObject("parts"); + + DataObjectPtr part4 = subassy2->createDataObject("parts"); + DataObjectPtr part5 = subassy2->createDataObject("parts"); + DataObjectPtr part6 = subassy2->createDataObject("parts"); + + + assy1->setCString("name","MicroFrame"); + assy1->setInteger("number",32768); + + subassy1->setCString("name","Legs"); + subassy2->setCString("name","Body"); + subassy1->setInteger("number",1); + subassy2->setInteger("number",2); + + part1->setCString("name","Leg1"); + part2->setCString("name","Leg2"); + part3->setCString("name","Leg3"); + part1->setInteger("number",10001); + part2->setInteger("number",10002); + part3->setInteger("number",10003); + + + part4->setCString("name","MainStrut"); + part5->setCString("name","Brace1"); + part6->setCString("name","Brace2"); + part4->setInteger("number",20001); + part5->setInteger("number",20002); + part6->setInteger("number",20003); + + // assy2 - shallow equal to assy, but not deep equal + + DataObjectPtr assy2 = mdg->create((Type&)tassy); + + DataObjectPtr subassy3 = assy2->createDataObject("subassemblies"); + DataObjectPtr subassy4 = assy2->createDataObject("subassemblies"); + + DataObjectPtr part7 = subassy3->createDataObject("parts"); + DataObjectPtr part8 = subassy3->createDataObject("parts"); + DataObjectPtr part9 = subassy3->createDataObject("parts"); + + DataObjectPtr part10 = subassy4->createDataObject("parts"); + DataObjectPtr part11 = subassy4->createDataObject("parts"); + DataObjectPtr part12 = subassy4->createDataObject("parts"); + + + assy2->setCString("name","MicroFrame"); + assy2->setInteger("number",32768); + + subassy3->setCString("name","Legs"); + subassy4->setCString("name","Body"); + subassy3->setInteger("number",1); + subassy4->setInteger("number",2); + + part7->setCString("name","Leg1"); + part8->setCString("name","Leg2"); + part9->setCString("name","Leg3"); + part7->setInteger("number",10001); + part8->setInteger("number",10002); + part9->setInteger("number",10003); + + + part10->setCString("name","MainStrut"); + part11->setCString("name","Brace1"); + part12->setCString("name","OddBrace2"); + part10->setInteger("number",20001); + part11->setInteger("number",20002); + part12->setInteger("number",20003); + + if (!EqualityHelper::equalShallow(assy1, assy2)) + { + if (!silent) cout << "EQUALITY HELPER TEST - failure at first test" << endl; + return 0; + } + if (EqualityHelper::equal(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at second test" << endl; + return 0; + } + + // Now alter assy2 to be deep equal... + + + part12->setCString("name","Brace2"); + + if (!EqualityHelper::equalShallow(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at third test" << endl; + return 0; + } + if (!EqualityHelper::equal(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at fourth test" << endl; + return 0; + } + + // now add a part, so its not deep equal again + DataObjectPtr part13 = subassy4->createDataObject("parts"); + + if (!EqualityHelper::equalShallow(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at fifth test" << endl; + return 0; + } + if (EqualityHelper::equal(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at sixth test" << endl; + return 0; + } + + // now remove that part again... + DataObjectList& dl = subassy4->getList("parts"); + dl.remove(3); + + // should be deep equal again... + + if (!EqualityHelper::equalShallow(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at seventh test" << endl; + return 0; + } + if (!EqualityHelper::equal(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at eighth test" << endl; + return 0; + } + // now make them not shallow equal + assy2->setInteger("number",32767); + + if (EqualityHelper::equalShallow(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at nineth test" << endl; + return 0; + } + if (EqualityHelper::equal(assy1, assy2)) + { + if (!silent)cout << "EQUALITY HELPER TEST - failure at tenth test" << endl; + return 0; + } + return 1; +} + +int sdotest::cohelpertest() +{ + + // copy and equality helpers + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Assembly"); + mdg->addType("myspace","SubAssembly"); + mdg->addType("myspace","Part"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tint = mdg->getType("commonj.sdo","Integer"); + const Type& tassy = mdg->getType("myspace","Assembly"); + const Type& tsubassy = mdg->getType("myspace","SubAssembly"); + const Type& tpart = mdg->getType("myspace","Part"); + + + mdg->addPropertyToType(tassy,"name",tstring); + mdg->addPropertyToType(tsubassy,"name",tstring); + mdg->addPropertyToType(tpart,"name",tstring); + + mdg->addPropertyToType(tassy,"number",tint); + mdg->addPropertyToType(tsubassy,"number",tint); + mdg->addPropertyToType(tpart,"number",tint); + + mdg->addPropertyToType(tassy,"subassemblies", tsubassy,true); + mdg->addPropertyToType(tsubassy,"parts", tpart,true); + + + // assy 1 + + DataObjectPtr assy1 = mdg->create((Type&)tassy); + + DataObjectPtr subassy1 = assy1->createDataObject("subassemblies"); + DataObjectPtr subassy2 = assy1->createDataObject("subassemblies"); + + DataObjectPtr part1 = subassy1->createDataObject("parts"); + DataObjectPtr part2 = subassy1->createDataObject("parts"); + DataObjectPtr part3 = subassy1->createDataObject("parts"); + + DataObjectPtr part4 = subassy2->createDataObject("parts"); + DataObjectPtr part5 = subassy2->createDataObject("parts"); + DataObjectPtr part6 = subassy2->createDataObject("parts"); + + + assy1->setCString("name","MicroFrame"); + assy1->setInteger("number",32768); + + subassy1->setCString("name","Legs"); + subassy2->setCString("name","Body"); + subassy1->setInteger("number",1); + subassy2->setInteger("number",2); + + part1->setCString("name","Leg1"); + part2->setCString("name","Leg2"); + part3->setCString("name","Leg3"); + part1->setInteger("number",10001); + part2->setInteger("number",10002); + part3->setInteger("number",10003); + + + part4->setCString("name","MainStrut"); + part5->setCString("name","Brace1"); + part6->setCString("name","Brace2"); + part4->setInteger("number",20001); + part5->setInteger("number",20002); + part6->setInteger("number",20003); + + // first lets shallow copy assy1: + + DataObjectPtr assy2 = CopyHelper::copyShallow(assy1); + + if (strcmp(assy2->getCString("name"),"MicroFrame")) + { + if (!silent)cout << "COPYHELPER shallow copy failed(1)" << endl; + return 0; + } + else if (assy2->getInteger("number") != 32768) + { + if (!silent)cout << "COPYHELPER shallow copy 1 failed(2)" << endl; + return 0; + } + else if (assy2->getList("subassemblies").size() != 0) + { + if (!silent)cout << "COPYHELPER shallow copy 1 failed(3)" << endl; + return 0; + } + else if (assy2->getContainer() != 0) + { + if (!silent)cout << "COPYHELPER shallow copy failed(4)" << endl; + return 0; + } + + // now deep copy it + + DataObjectPtr assy3 = CopyHelper::copy(assy1); + + if (!EqualityHelper::equal(assy1, assy3)) + { + if (!silent)cout << "COPYHELPER deep copy failed(1)" << endl; + return 0; + } + else if (assy3->getContainer() != 0) + { + if (!silent)cout << "COPYHELPER deep copy failed(2)" << endl; + return 0; + } + return 1; +} + + +int sdotest::cssave() +{ + + try { + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("company.xsd"); + + //mdg->addType("companyNS","CompanyType"); + //mdg->addType("companyNS","EmployeeType"); + //mdg->addType("companyNS","DepartmentType"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + + //mdg->addPropertyToType(tcomp,"name",tstring); + // not containment... + //mdg->addPropertyToType(tcomp,"employeeOfTheMonth",temp, false,false,false); + //mdg->addPropertyToType(tcomp,"departments",tdept, true); + //mdg->addPropertyToType(tcomp,"cs",tcs); + + //mdg->addPropertyToType(tdept,"name",tstring); + //mdg->addPropertyToType(tdept,"location",tstring); + //mdg->addPropertyToType(tdept,"number",tstring); + //mdg->addPropertyToType(tdept,"employees",temp,true); + + //mdg->addPropertyToType(temp, "name",tstring); + //mdg->addPropertyToType(temp, "SN", tstring); + //mdg->addPropertyToType(temp, "manager", tbool); + + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","ACME"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","Advanced Technologies"); + dept->setCString("location","NY"); + dept->setCString("number","123"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + + emp1->setCString("name","John Jones"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Mary Smith"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Jane Doe"); + emp3->setCString("SN","E0003"); + + DataObjectList& dol2 = dept->getList("employees"); + dol2.append(emp1); + dol2.append(emp2); + dol2.append(emp3); + + comp->setDataObject("employeeOfTheMonth",emp2); + + ChangeSummaryPtr cs = comp->getChangeSummary(); + + cs->beginLogging(); + + DataObjectPtr emp4 = mdg->create(temp); + emp4->setCString("name","Al Smith"); + emp4->setCString("SN","E0004"); + emp4->setBoolean("manager",true); + + // first change - create employee 4 + dol2.append(emp4); + + dol2.remove(1); // element 1 is Mary + + DataObjectPtr emp5 = mdg->create(temp); + emp5->setCString("name","Bill Withers"); + emp5->setCString("SN","E0005"); + + dol2.append(emp5); + + + comp->setCString("name","MegaCorp"); + comp->setDataObject("employeeOfTheMonth",emp4); + + // silly test - add mary back again + dol2.append(emp2); + + + + + cs->endLogging(); + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->createDocument(comp,"companyNS","company"); + xmh->save(doc,"cssave-output.xml"); + return comparefiles("cssave-output.xml","cssave-output.txt"); + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "CSSAVE FAILED" << e << endl; + return 0; + } +} + +int sdotest::cssave2() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("company.xsd"); + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","Eastleigh Borough Council"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","Waste Disposal"); + dept->setCString("location","Botley"); + dept->setCString("number","123"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + DataObjectPtr emp4 = mdg->create(temp); + DataObjectPtr emp5 = mdg->create(temp); + + emp1->setCString("name","Alphonse Dodet"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Bridget Jones"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Colin Thorne"); + emp3->setCString("SN","E0003"); + + emp4->setCString("name","Donald Trump"); + emp4->setCString("SN","E0004"); + + emp5->setCString("name","Eddy the eagle"); + emp5->setCString("SN","E0005"); + + DataObjectList& dol2 = dept->getList("employees"); + dol2.append(emp1); + dol2.append(emp2); + dol2.append(emp3); + dol2.append(emp4); + dol2.append(emp5); + + //comp->setDataObject("employeeOfTheMonth",emp2); + + DataObjectPtr dept2 = mdg->create((Type&)tdept); + dol.append(dept2); + + dept2->setCString("name","Tax Collection"); + dept2->setCString("location","Winchester"); + dept2->setCString("number","666"); + + DataObjectPtr empb1 = mdg->create(temp); + DataObjectPtr empb2 = mdg->create(temp); + DataObjectPtr empb3 = mdg->create(temp); + DataObjectPtr empb4 = mdg->create(temp); + DataObjectPtr empb5 = mdg->create(temp); + + empb1->setCString("name","Arch Meanie"); + empb1->setCString("SN","D0001"); + + empb2->setCString("name","Boris the Spider"); + empb2->setCString("SN","D0002"); + empb2->setBoolean("manager",true); + + empb3->setCString("name","Cash Hoarder"); + empb3->setCString("SN","D0003"); + + empb4->setCString("name","Dean Giyatoss"); + empb4->setCString("SN","D0004"); + + empb5->setCString("name","Ebenezer Scrooge"); + empb5->setCString("SN","D0005"); + + DataObjectList& dol3 = dept2->getList("employees"); + dol3.append(empb1); + dol3.append(empb2); + dol3.append(empb3); + dol3.append(empb4); + dol3.append(empb5); + + ChangeSummaryPtr cs = comp->getChangeSummary(); + + cs->beginLogging(); + + // start by deleting a few employees from dept 1 + + dol2.remove(1); // B + dol2.remove(1); // C + dol2.remove(1); // D + + // Now delete the tax collectors as a whole + + dol.remove(1); + + // now perhaps add back one of the employees + + dol2.append(emp3); // C + + comp->setCString("name","MegaCorp"); + + try { + comp->setDataObject("employeeOfTheMonth",emp4); + if (!silent)cout << "emp4 was not in the tree" << endl; + return 0; + } + catch (SDORuntimeException e) + { + } + + comp->setDataObject("employeeOfTheMonth",emp5); + + cs->endLogging(); + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->createDocument(comp,"companyNS","company"); + xmh->save(doc,"cssave2-output.xml"); + return comparefiles("cssave2-output.xml","cssave2-output.txt"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "CSSAVE FAILED" << e << endl; + return 0; + } +} + + + + + +int sdotest::b45933() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + + mdg->addType("companyNS","CompanyType"); + mdg->addType("companyNS","WombatType"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& twom = mdg->getType("companyNS","WombatType"); + + + mdg->addPropertyToType(tcomp,"name",tstring); + mdg->addPropertyToType(tcomp,"bools",tbool, true); + mdg->addPropertyToType(tcomp,"woms",twom, true); + mdg->addPropertyToType(tcomp,"cs",tcs); + + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","Bug45933"); + + ChangeSummaryPtr cs = comp->getChangeSummary(); + + cs->beginLogging(); + + DataObjectList& dol = comp->getList("bools"); + dol.append(false); + dol.remove(0); + DataObjectPtr awom = mdg->create((Type&)twom); + DataObjectList& dol2 = comp->getList("woms"); + dol2.append(awom); + dol2.remove(0); + + cs->endLogging(); + + //dumpchangesummary(cs); + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->createDocument(comp,"companyNS","company"); + xmh->save(doc,"bug45933-output.xml"); + return comparefiles("bug45933-output.xml","bug45933-output.txt"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "BUG45933 FAILED" << endl << e << endl; + return 0; + } +} + +int sdotest::b46617() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + //XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + //xsh->defineFile("b46617.xsd"); + mdg->addType("companyNS","CompanyType"); + mdg->addType("companyNS","DepartmentType"); + mdg->addType("companyNS","EmployeeType"); + + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + mdg->addPropertyToType(tcomp,"name",tstring); + mdg->addPropertyToType(tcomp,"departments",tdept,true,false,true); + mdg->addPropertyToType(tcomp,"employeeOfTheMonth",temp,false,false,false); + mdg->addPropertyToType(tcomp,"CEO",temp,false,false,true); + + mdg->addPropertyToType(tdept,"employees",temp,true,false,true); + mdg->addPropertyToType(tdept,"name",tstring,false,false,true); + mdg->addPropertyToType(tdept,"location",tstring,false,false,true); + mdg->addPropertyToType(tdept,"number",tstring,false,false,true); + + mdg->addPropertyToType(temp,"name",tstring,false,false,true); + mdg->addPropertyToType(temp,"SN",tstring,false,false,true); + mdg->addPropertyToType(temp,"manager",tbool,false,false,true); + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","Eastleigh Borough Council"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","Waste Disposal"); + dept->setCString("location","Botley"); + dept->setCString("number","123"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + + emp1->setCString("name","Alphonse Dodet"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Bridget Jones"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Carl Marx"); + emp3->setCString("SN","E0003"); + + comp->setDataObject("CEO",emp2); + + DataObjectList& dol2 = dept->getList("employees"); + dol2.append(emp1); + //dol2.append(emp2); + dol2.append(emp3); + + comp->setDataObject("employeeOfTheMonth",emp2); + + XSDHelperPtr xmd = HelperProvider::getXSDHelper(mdg); + xmd->generateFile(mdg->getTypes(), + "b46617.xsd","companyNS"); + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->createDocument(comp,"companyNS","company"); + xmh->save(doc,"b46617.xml"); + + // now try loading the xml, using the same schema, and see if we get the + // same answer + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("b46617.xml", "companyNS"); + DataObjectPtr newdob = myXMLDocument->getRootDataObject(); + + + if (strcmp(newdob->getDataObject("employeeOfTheMonth")->getCString("name"), + "Bridget Jones")) + { + if (!silent)cout << "Employee of the month name has changed" << endl; + return 0; + } + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "b46617 failed" << e << endl; + return 0; + } +} + +int sdotest::b46617b() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("b46617b.xsd"); + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("b46617b.xml", "companyNS"); + DataObjectPtr newdob = myXMLDocument->getRootDataObject(); + + if (strcmp(newdob->getDataObject("employeeOfTheMonth")->getCString("name"), + "Fred Smith")) + { + if (!silent)cout << "Employee of the month name has changed" << endl; + return 0; + } + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "b46617b failed" << e << endl; + return 0; + } +} + +int sdotest::notfound() +{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + try { + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("not_present.xsd"); + } + catch (SDOFileNotFoundException e) + { + //cout << "NotFound threw correct exception " << endl; + } + + catch (SDORuntimeException e) + { + if (!silent)cout << "NOTFOUND THREW THE WRONG EXCEPTION" << e << endl; + return 0; + } + + try { + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("not-present.xml", "companyNS"); + + } + catch (SDOFileNotFoundException ee) + { + //cout << "NotFound threw the correct exception" << endl; + } + + catch (SDORuntimeException e) + { + if (!silent)cout << "NOTFOUND THREW THE WRONG EXCEPTION" << e << endl; + return 0; + } + return 1; +} + +int sdotest::csload() +{ + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("company.xsd"); + + //cout << "TYPES LOADED FROM COMPANY XSD" << endl; + + //TypeList tl = mdg->getTypes(); + //for (int i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("cssave-output.xml", "companyNS"); + //myXMLDocument->setRootElementName("company"); + //myXMLHelper->save(myXMLDocument,"csload-output.xml"); + myXMLHelper->save(myXMLDocument->getRootDataObject(), + 0, "company", "csload-output.xml"); + + return comparefiles("csload-output.xml","csload-output.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "CSLOAD FAILED" << e << endl; + return 0; + } + +} + +int sdotest::testsubsload() +{ + try + { + FILE *f = fopen("testsubsload.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open testsubsload.dat" << endl; + return 0; + } + + fprintf(f,"TEST: TestSubsLoad ==========================================\n"); + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("companysubs.xsd"); + + //cout << "TYPES LOADED FROM COMPANYSUBS XSD" << endl; + + //TypeList tl = mdg->getTypes(); + //for (int i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + // so now we should be able to put book or a magazine into + // the publication under company... + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& book = mdg->getType("companyNS","BookType"); + const Type& mag = mdg->getType("companyNS","MagazineType"); + const Type& pub = mdg->getType("companyNS","PublicationType"); + + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","Puflet Publishing"); + + + DataObjectPtr book1 = mdg->create(book); + book1->setCString("author","Mr P B Writer"); + // inherted from publication + book1->setCString("title","Nowhere Man"); + + DataObjectPtr mag1 = mdg->create(mag); + mag1->setCString("editor","Mr B Picky"); + // inherited from publication + mag1->setCString("title","Bionicle Weekly"); + + DataObjectPtr pub1 = mdg->create(pub); + pub1->setCString("title","Noddy In Toyland"); + + + // publication should accept any of them... + + comp->setDataObject("Publication",pub1); + const Type& tpub1 = comp->getDataObject("Publication")->getType(); + fprintf(f,"Publication is of type %s\n",tpub1.getName()); + + comp->setDataObject("Publication",book1); + const Type& tpub2 = comp->getDataObject("Publication")->getType(); + fprintf(f,"Publication is of type %s\n",tpub2.getName()); + + comp->setDataObject("Publication",mag1); + const Type& tpub3 = comp->getDataObject("Publication")->getType(); + fprintf(f,"Publication is of type %s\n",tpub3.getName()); + + // should be able to address publication as book or magazine + + comp->setDataObject("Book",book1); + const Type& tpub4 = comp->getDataObject("Book")->getType(); + fprintf(f, "Book is of type %s\n",tpub4.getName()); + + comp->setDataObject("Magazine",mag1); + const Type& tpub5 = comp->getDataObject("Magazine")->getType(); + fprintf(f,"Magazine is of type %s\n",tpub5.getName()); + fprintf(f,"END TEST: TestSubsLoad ======================================\n"); + fclose(f); + return comparefiles("testsubsload.dat","testsubsload.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in TeseSubsLoad" << e << endl; + return 0; + } +} + +int sdotest::testSCA() +{ + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("sca.xsd"); + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in TeseSCA" << e << endl; + return 0; + } +} + +int sdotest::testabstract() +{ + try + { + + FILE *f = fopen("testabstract.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open testabstract.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("companyabs.xsd"); + + //cout << "TYPES LOADED FROM COMPANYABS XSD" << endl; + + //TypeList tl = mdg->getTypes(); + //for (int i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + // so now we should be able to put book or a magazine into + // the publication under company... + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& book = mdg->getType("companyNS","BookType"); + const Type& mag = mdg->getType("companyNS","MagazineType"); + const Type& pub = mdg->getType("companyNS","PublicationType"); + + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","Puflet Publishing"); + + // should be allowed... + DataObjectPtr book1 = mdg->create(book); + book1->setCString("author","Mr P B Writer"); + // inherted from publication + book1->setCString("title","Nowhere Man"); + + DataObjectPtr mag1 = mdg->create(mag); + mag1->setCString("editor","Mr B Picky"); + // inherited from publication + mag1->setCString("title","Bionicle Weekly"); + + try { + DataObjectPtr pub1 = mdg->create(pub); + pub1->setCString("title","Noddy In Toyland"); + } + catch (SDOUnsupportedOperationException e) + { + fprintf(f,"Normal unsupportedoperation for creation of abstract type\n"); + } + + + // publication should accept books and magazines... + + comp->setDataObject("Publication",book1); + const Type& tpub2 = comp->getDataObject("Publication")->getType(); + fprintf(f,"Publication is of type %s\n",tpub2.getName()); + + comp->setDataObject("Publication",mag1); + const Type& tpub3 = comp->getDataObject("Publication")->getType(); + fprintf(f,"Publication is of type %s\n",tpub3.getName()); + + // should be able to address publication as book or magazine + + comp->setDataObject("Book",book1); + const Type& tpub4 = comp->getDataObject("Book")->getType(); + fprintf(f,"Book is of type %s\n",tpub4.getName()); + + comp->setDataObject("Magazine",mag1); + const Type& tpub5 = comp->getDataObject("Magazine")->getType(); + fprintf(f,"Magazine is of type %s\n",tpub5.getName()); + + fclose(f); + return comparefiles("testabstract.dat","testabstract.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in TestAbstract" << e << endl; + return 0; + } +} + +int sdotest::testOpen() +{ + try + { + + FILE *f = fopen("testopen.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open testopen.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + + mdg->addType("companyNS","CompanyType"); + // employee will be an open type... + mdg->addType("companyNS","EmployeeType", /*seq*/false, + /*open*/true, + /*abs */ false, + /*data*/ false); + + mdg->addType("companyNS","DepartmentType"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + + mdg->addPropertyToType(tcomp,"name",tstring); + // not containment... + mdg->addPropertyToType(tcomp,"employeeOfTheMonth",temp, false,false,false); + mdg->addPropertyToType(tcomp,"departments",tdept, true); + mdg->addPropertyToType(tcomp,"cs",tcs); + + mdg->addPropertyToType(tdept,"name",tstring); + mdg->addPropertyToType(tdept,"location",tstring); + mdg->addPropertyToType(tdept,"number",tstring); + mdg->addPropertyToType(tdept,"employees",temp,true); + + mdg->addPropertyToType(temp, "name",tstring); + mdg->addPropertyToType(temp, "SN", tstring); + mdg->addPropertyToType(temp, "manager", tbool); + + + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","ACME"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","Advanced Technologies"); + dept->setCString("location","NY"); + dept->setCString("number","123"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + + emp1->setCString("name","Albert"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Boris"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Carl"); + emp3->setCString("SN","E0003"); + + // now we should be able to add extra properties to employees, + // and get them back again... + + try { + emp1->setNull("openstring"); + return 0; + } + catch (SDOUnsupportedOperationException e) + { + fprintf(f,"Normal exception for setting null on undefined prop\n"); + } + + emp1->setCString("openstring","Value Of Open String"); + emp1->setBoolean("openboolean",true); + + const char* c = emp1->getCString("openstring"); + + fprintf(f,"Open Type string value: %s\n",c); + + bool b = emp1->getBoolean("openboolean"); + + fprintf(f,"Open Type boolean value: %d\n", b); + + // unknown list type at present.. + DataObjectList& dl = emp1->getList("opentypelist"); + + int i = 45; + dl.append((short)i); // now the list must be primitive + + // we should now have instance properties + PropertyList pl = emp1->getType().getProperties(); + + for (i=0;i<pl.size();i++) + { + fprintf(f,"EMP1 type property: %s ( many? %d) of type %s\n" ,pl[i].getName() + , pl[i].isMany(), + pl[i].getType().getName()); + } + + PropertyList pli = emp1->getInstanceProperties(); + + for (i=0;i<pli.size();i++) + { + fprintf(f, "EMP1 inst property: %s (many? %d) of type %s\n", + pli[i].getName(), pli[i].isMany(), pli[i].getType().getName()); + } + + + // now we try to set the string to null.. + + emp1->setNull("openstring"); + + emp1->setCString("openstring","New Value Of Open String"); + + + // now unset them and see them disappear - what happens to the indices? + + emp1->unset("openstring"); + + PropertyList plk = emp1->getInstanceProperties(); + + for (i=0;i<plk.size();i++) + { + fprintf(f,"EMP1 inst property: %s (many? %d) of type %s\n", + plk[i].getName(), plk[i].isMany(), plk[i].getType().getName()); + } + + emp1->unset("openboolean"); + + dl.remove(0); // so is this list gone, or empty - I vote for still there. + + PropertyList pll = emp1->getInstanceProperties(); + for (i=0;i<pll.size();i++) + { + fprintf(f,"EMP1 inst property: %s (many? %d) of type %s\n", + pll[i].getName(), pll[i].isMany(),pll[i].getType().getName()); + } + + emp1->unset("opentypelist"); + + // now I vote for gone... + + PropertyList plm = emp1->getInstanceProperties(); + for (i=0;i<plm.size();i++) + { + fprintf(f,"EMP1 inst property: %s (many? %d) of type %s\n", plm[i].getName() + , plm[i].isMany() , plm[i].getType().getName()); + } + + fclose(f); + return comparefiles("testopen.dat","testopen.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in TestOpen" << e << endl; + return 0; + } +} + +int sdotest::saveOpen() +{ + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + + mdg->addType("companyNS","CompanyType"); + // employee will be an open type... + mdg->addType("companyNS","EmployeeType", /*seq*/false, + /*open*/true, + /*abs */ false, + /*data*/ false); + + mdg->addType("companyNS","DepartmentType"); + + mdg->addType("companyNS","OpenType"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + const Type& topen = mdg->getType("companyNS","OpenType"); + + + mdg->addPropertyToType(tcomp,"name",tstring); + // not containment... + mdg->addPropertyToType(tcomp,"employeeOfTheMonth",temp, false,false,false); + mdg->addPropertyToType(tcomp,"departments",tdept, true); + mdg->addPropertyToType(tcomp,"cs",tcs); + + mdg->addPropertyToType(tdept,"name",tstring); + mdg->addPropertyToType(tdept,"location",tstring); + mdg->addPropertyToType(tdept,"number",tstring); + mdg->addPropertyToType(tdept,"employees",temp,true); + + mdg->addPropertyToType(temp, "name",tstring); + mdg->addPropertyToType(temp, "SN", tstring); + mdg->addPropertyToType(temp, "manager", tbool); + + mdg->setAlias("companyNS","CompanyType","TheFirm"); + mdg->setAlias("companyNS","CompanyType","departments","TheDepartments"); + mdg->setAlias("companyNS","CompanyType","departments","MYDepartments"); + mdg->setAlias("companyNS","CompanyType","TheBigFirm"); + + mdg->addPropertyToType(topen,"name",tstring); + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","ACME"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + ChangeSummaryPtr cs = comp->getChangeSummary(); + + cs->beginLogging(); + + dept->setCString("name","Advanced Technologies"); + dept->setCString("location","NY"); + dept->setCString("number","123"); + + DataObjectList& emps = dept->getList("employees"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + + emps.append(emp1); + emps.append(emp2); + emps.append(emp3); + + emp1->setCString("name","Albert"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Boris"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Carl"); + emp3->setCString("SN","E0003"); + + // now we should be able to add extra properties to employees, + // and get them back again... + + + emp1->setCString("openstring","Value Of Open String"); + emp1->setBoolean("openboolean",true); + + const char* c = emp1->getCString("openstring"); + + //cout << "Open Type string value: " << c << endl; + + bool b = emp1->getBoolean("openboolean"); + + //cout << "Open Type boolean value: " << b << endl; + + // unknown list type at present.. + DataObjectList& dl = emp1->getList("openintlist"); + + int i = 45; + dl.append((short)i); // now the list must be primitive and short!! + + // unknown list type at present.. + DataObjectList& dl2 = emp1->getList("opendataobjectlist"); + + DataObjectPtr myopen = mdg->create("companyNS","OpenType"); + myopen->setCString("name","MyOpenName"); + dl2.append(myopen); // now the list must be of data objects + + + // now a single valued data object - should have an xsi:type + emp1->setDataObject("opendataobject", myopen); + + + cs->endLogging(); + + //dumpchangesummary(cs); + + XSDHelperPtr xdh = HelperProvider::getXSDHelper(mdg); + + xdh->generateFile(mdg->getTypes(), + "saveopen-output.xsd","companyNS"); + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->createDocument(comp,"companyNS","company"); + xmh->save(doc,"saveopen-output.xml"); + + return comparefiles("saveopen-output.xml","saveopen-output.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in SaveOpen" << e << endl; + return 0; + } +} + +int sdotest::loadOpen() +{ + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("saveopen-output.xsd"); + + + //cout << "TYPES LOADED FROM COMPANY XSD" << endl; + //int i; + //TypeList tl = mdg->getTypes(); + //for (i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + + + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("partial.xml", "companyNS"); + + + + // so, we now expect that the openboolean and openstring props will + // be of type boolean and Bytes, and the openlist will be a list of integers. + // The dataobjectlist an dataobject will be of the correct OpenType + + // we need a test for data objects, and that we are writing out xsi:type + // correctly. + DataObjectPtr comp = myXMLDocument->getRootDataObject(); + DataObjectList& dl = comp->getList("departments"); + DataObjectPtr dept = dl[0]; + DataObjectList& dl2 = dept->getList("employees"); + DataObjectPtr emp = dl2[0]; + + if (strcmp(emp->getProperty("openboolean").getType().getName(), + "Boolean")) + { + if (!silent)cout << "OpenLoad failure - bool property not boolean" << endl; + return 0; + + } + if (emp->getBoolean("openboolean") != true) + { + if (!silent)cout << "OpenLoad failure - bool property not true" << endl; + return 0; + } + + if (strcmp(emp->getProperty("openstring").getType().getName(), + "Bytes")) + { + if (!silent)cout << "OpenLoad failure - bytes property not bytes" << endl; + return 0; + + } + if (strcmp(emp->getCString("openstring"),"Value Of Open String")) + { + if (!silent)cout << "OpenLoad failure - string value is" << + emp->getCString("openstring") << endl; + return 0; + } + + + DataObjectList& dl3 = emp->getList("openintlist"); + + if (strcmp(emp->getProperty("openintlist").getType().getName(), + "Short")) + { + if (!silent)cout << "OpenLoad failure - IntegerList not Short " << + emp->getProperty("openintlist").getType().getName() << endl; + return 0; + } + + if (dl3.getInteger(0) != 45) + { + if (!silent)cout << "OpenLoad failure - Integer value is" << + dl.getInteger(0) << endl; + return 0; + } + + if (strcmp(emp->getProperty("opendataobjectlist").getType().getName(), + "OpenType")) + { + if (!silent)cout << "OpenLoad failure - OpenTypeList not OpenType" << endl; + return 0; + } + + DataObjectList& dl4 = emp->getList("opendataobjectlist"); + + if (strcmp(dl4[0]->getCString("name"),"MyOpenName")) + { + if (!silent)cout << "OpenLoad failure - list element name is " << + dl4[0]->getCString("name") << endl; + return 0; + } + + if (strcmp(emp->getProperty("opendataobject").getType().getName(), + "OpenType")) + { + if (!silent)cout << "OpenLoad failure - OpenType not OpenType" << endl; + return 0; + } + + DataObjectPtr dob2 = emp->getDataObject("opendataobject"); + + if (strcmp(dob2->getCString("name"),"MyOpenName")) + { + if (!silent)cout << "OpenLoad failure - open value name is " << + dob2->getCString("name") << endl; + return 0; + } + + + myXMLHelper->save(myXMLDocument->getRootDataObject(), + 0, "company", "loadload-output.xml"); + return comparefiles("loadload-output.xml","loadload-output.txt"); + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "LoadOpen FAILED" << e << endl; + return 0; + } + +} + +int sdotest::loadOpenNS() +{ + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("openloadNS.xsd"); + xsh->defineFile("openloadNS2.xsd"); + + + //cout << "TYPES LOADED FROM COMPANY XSD" << endl; + //int i; + //TypeList tl = mdg->getTypes(); + //for (i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + + + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("openloadNS.xml", "companyNS"); + + + + // so, we now expect that the openboolean and openstring props will + // be of type boolean and Bytes, and the openlist will be a list of integers. + // The dataobjectlist an dataobject will be of the correct OpenType + + // we need a test for data objects, and that we are writing out xsi:type + // correctly. + DataObjectPtr comp = myXMLDocument->getRootDataObject(); + DataObjectList& dl = comp->getList("departments"); + DataObjectPtr dept = dl[0]; + DataObjectList& dl2 = dept->getList("employees"); + DataObjectPtr emp = dl2[0]; + + if (strcmp(emp->getProperty("openboolean").getType().getName(), + "Boolean")) + { + if (!silent)cout << "OpenLoadNS failure - bool property not boolean" << endl; + return 0; + + } + if (emp->getBoolean("openboolean") != true) + { + if (!silent)cout << "OpenLoadNS failure - bool property not true" << endl; + return 0; + } + + if (strcmp(emp->getProperty("openstring").getType().getName(), + "Bytes")) + { + if (!silent)cout << "OpenLoadNS failure - bytes property not bytes" << endl; + return 0; + + } + if (strcmp(emp->getCString("openstring"),"Value Of Open String")) + { + if (!silent)cout << "OpenLoadNS failure - string value is" << + emp->getCString("openstring") << endl; + return 0; + } + + + DataObjectList& dl3 = emp->getList("openintlist"); + + if (strcmp(emp->getProperty("openintlist").getType().getName(), + "Short")) + { + if (!silent)cout << "OpenLoadNS failure - IntegerList not Short " << + emp->getProperty("openintlist").getType().getName() << endl; + return 0; + } + + if (dl3.getInteger(0) != 45) + { + if (!silent)cout << "OpenLoadNS failure - Integer value is" << + dl.getInteger(0) << endl; + return 0; + } + + + + myXMLHelper->save(myXMLDocument->getRootDataObject(), + 0, "company", "openloadNSout.xml"); + + if (!comparefiles("openloadNSout.xml","openloadNSout.txt"))return 0; + + + // now try exactly the same, but with NS which doesnt exist + XMLDocumentPtr myXMLDocument2 = myXMLHelper->loadFile("openloadNS2.xml", "companyNS"); + + + + // so, we now expect that the openboolean and openstring props will + // be of type boolean and Bytes, and the openlist will be a list of integers. + // The dataobjectlist an dataobject will be of the correct OpenType + + // we need a test for data objects, and that we are writing out xsi:type + // correctly. + DataObjectPtr comp2 = myXMLDocument2->getRootDataObject(); + DataObjectList& dld = comp2->getList("departments"); + DataObjectPtr dept2 = dld[0]; + DataObjectList& dl22 = dept2->getList("employees"); + DataObjectPtr emp2 = dl22[0]; + + if (strcmp(emp2->getProperty("openboolean").getType().getName(), + "Bytes")) + { + if (!silent)cout << "OpenLoadNS2 failure - bool property not bytes" << endl; + return 0; + + } + if (emp2->getBoolean("openboolean") != true) + { + if (!silent)cout << "OpenLoadNS2 failure - bool property not true" << endl; + return 0; + } + + if (strcmp(emp2->getProperty("openstring").getType().getName(), + "Bytes")) + { + if (!silent)cout << "OpenLoadNS2 failure - bytes property not bytes" << endl; + return 0; + + } + if (strcmp(emp2->getCString("openstring"),"Value Of Open String")) + { + if (!silent)cout << "OpenLoadNS failure - string value is" << + emp2->getCString("openstring") << endl; + return 0; + } + + + DataObjectList& dl32 = emp2->getList("openintlist"); + + if (strcmp(emp2->getProperty("openintlist").getType().getName(), + "OpenDataObject")) + { + if (!silent)cout << "OpenLoadNS2 failure - IntegerList not OpenDataObject " << + emp2->getProperty("openintlist").getType().getName() << endl; + return 0; + } + + if (atoi(dl32.getDataObject(0)->getSequence()->getCStringValue(0)) != 45) + { + if (!silent)cout << "OpenLoadNS2 failure - Integer value is" << + dl32.getInteger(0) << endl; + return 0; + } + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "LoadOpenNS FAILED" << e << endl; + return 0; + } + +} + +int sdotest::loadManyOpen() +{ + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("many.xsd"); + + + //cout << "TYPES LOADED FROM COMPANY XSD" << endl; + //int i; + //TypeList tl = mdg->getTypes(); + //for (i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + + + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("many.xml", "companyNS"); + + + + // so, we now expect that the openboolean and openstring props will + // be of type boolean and Bytes, and the openlist will be a list of integers. + // The dataobjectlist an dataobject will be of the correct OpenType + + // we need a test for data objects, and that we are writing out xsi:type + // correctly. + DataObjectPtr comp = myXMLDocument->getRootDataObject(); + DataObjectList& dl = comp->getList("departments"); + DataObjectPtr dept = dl[0]; + DataObjectList& dl2 = dept->getList("employees"); + DataObjectPtr emp = dl2[0]; + + + DataObjectList& dl3 = emp->getList("openlist"); + + // change to match spec - now an open data object + // the list should contain a single data object with a sequence of three text elements + + if (strcmp(emp->getProperty("openlist").getType().getName(), + "OpenDataObject")) + { + if (!silent)cout << "OpenManyLoad failure - BytesList not OpenDataObject " << + emp->getProperty("openlist").getType().getName() << endl; + return 0; + } + + if (dl3.size() != 3) + { + if (!silent)cout << "OpenManyLoad failure - size is " << + dl3.size() << endl; + return 0; + } + + SequencePtr sq = dl3[0]->getSequence(); + if (strcmp(sq->getCStringValue(0),"Three member")) return 0; + + SequencePtr sq2 = dl3[1]->getSequence(); + if (strcmp(sq2->getCStringValue(0),"Open bytes")) return 0; + + SequencePtr sq3 = dl3[2]->getSequence(); + if (strcmp(sq3->getCStringValue(0),"List is complete")) return 0; + + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "LoadOpen FAILED" << e << endl; + return 0; + } + +} + +int sdotest::csload2() +{ + //cout << "TEST: CSLoad2 ===============================================" << endl; + try + { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("company.xsd"); + + //cout << "TYPES LOADED FROM COMPANY XSD" << endl; + + //TypeList tl = mdg->getTypes(); + //for (int i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("cssave2-output.xml", "companyNS"); + myXMLHelper->save(myXMLDocument->getRootDataObject(), + 0, "company", "csload2-output.xml"); + + if (!comparefiles("csload2-output.xml","csload2-output.txt")) return 0; + + XMLDocumentPtr myXMLDocument2 = myXMLHelper->loadFile("csload2-output.xml", "companyNS"); + myXMLHelper->save(myXMLDocument2->getRootDataObject(), + 0, "company", "csload3-output.xml"); + + return comparefiles("csload3-output.xml","csload3-output.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in CsLoad2" << e << endl; + return 0; + } +} + +int sdotest::bug1() +{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + try { + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("bugs/1/company.xsd"); + + //TypeList tl = mdg->getTypes(); + //for (int i=0;i< tl.size(); i++) + //{ + // cout << tl[i].getURI() << ":" << tl[i].getName() << endl; + //} + + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("bugs/1/company.xml", + "http://www.mycompanyinc.com"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in Bug1" << e << endl; + return 0; + } + return 1; +} + +int sdotest::setnull() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("NullNS","NullMainType"); + mdg->addType("NullNS","NullSubType"); + + /* Now add the properties to the types...*/ + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tint = mdg->getType("commonj.sdo","Integer"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tmain = mdg->getType("NullNS","NullMainType"); + const Type& tsub = mdg->getType("NullNS","NullSubType"); + + + mdg->addPropertyToType(tmain,"name",tstring); + mdg->addPropertyToType(tmain,"subs",tsub, true); // many + mdg->addPropertyToType(tmain,"asub",tsub, false); // single + mdg->addPropertyToType(tmain,"bsub",tsub, false); // single + + mdg->addPropertyToType(tmain,"cs",tcs); // change summary + + mdg->addPropertyToType(tsub,"name",tstring); + mdg->addPropertyToType(tsub,"number",tint); + mdg->addPropertyToType(tsub,"bool",tbool); + + + // create a graph, then save it + + DataObjectPtr main1 = mdg->create((Type&)tmain); + main1->setCString("name","MainObject"); + + // asub is initially set + DataObjectPtr sub0 = main1->createDataObject("asub"); + // bsub is not set. + + DataObjectPtr sub1 = mdg->create((Type&)tsub); + DataObjectPtr sub2 = mdg->create((Type&)tsub); + DataObjectPtr sub3 = mdg->create((Type&)tsub); + + DataObjectList& dol = main1->getList("subs"); + + dol.append(sub1); + dol.append(sub2); + dol.append(sub3); + + // sub1 has all values set initially + + sub1->setCString("name","All Initially set"); + sub1->setInteger("number",100); + sub1->setBoolean("bool",false); + + // sub2 has no values set at all + + + // sub3 has all values set to null + sub3->setNull("name"); + sub3->setNull("number"); + sub3->setNull("bool"); + + + // report + + if (main1->isNull("asub")) return 0; + + if (!main1->isSet("asub")) return 0; + + if (main1->isNull("bsub")) return 0; + + if (main1->isSet("bsub")) return 0; + +// dol0 is set, not null + + if (dol[0]->isNull("name")) return 0; + + if (dol[0]->isNull("number")) return 0; + + if (dol[0]->isNull("bool")) return 0; + + if (!dol[0]->isSet("name")) return 0; + + if (!dol[0]->isSet("number")) return 0; + + if (!dol[0]->isSet("bool")) return 0; + +// dol1 is all unset , so no nulls + + if (dol[1]->isNull("name")) return 0; + + if (dol[1]->isNull("number")) return 0; + + if (dol[1]->isNull("bool")) return 0; + + if (dol[1]->isSet("name")) return 0; + + if (dol[1]->isSet("number")) return 0; + + if (dol[1]->isSet("bool")) return 0; + +// dol2 is all nulls, so all set + + if (!dol[2]->isNull("name")) return 0; + + if (!dol[2]->isNull("number")) return 0; + + if (!dol[2]->isNull("bool")) return 0; + + if (!dol[2]->isSet("name")) return 0; + + if (!dol[2]->isSet("number")) return 0; + + if (!dol[2]->isSet("bool")) return 0; + + ChangeSummaryPtr cs = main1->getChangeSummary(); + + cs->beginLogging(); + + main1->setNull("asub"); + main1->setNull("bsub"); + + dol[0]->setNull("name"); + dol[0]->setNull("number"); + dol[0]->setNull("bool"); + + dol[1]->setNull("bool"); + + dol[2]->setCString("name","NewName"); + dol[2]->setInteger("number",100); + dol[2]->setBoolean("bool",true); + + + cs->endLogging(); + + // what would we expect from the change summary? + + //cout << "==============Expected in Change Summary=================" << endl; + //cout << "change to main1 - object asub set to null, oldvalue asub (set)" << endl; + //cout << "change to main1 - object bsub set to null, oldvalue null (unset)" << endl; + //cout << "change to sub1 - name asub set to null, oldvalue \"All Initially Set\" (set)" << endl; + //cout << "change to sub1 - number asub set to null, oldvalue 100 (set)" << endl; + //cout << "change to sub1 - bool asub set to null, oldvalue false (set)" << endl; + //cout << "change to sub2 - bool asub set to null, oldvalue false (unset)" << endl; + //cout << "change to sub3 - name asub set to \"NewName\", oldvalue null, set" << endl; + //cout << "change to sub3 - number asub set to 100, oldvalue null, set" << endl; + //cout << "change to sub3 - bool asub set to true, oldvalue null, set" << endl; + //cout << "==============End Expected in Change Summary=============" << endl; + + FILE* f = fopen("setnull.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open setnull.dat" << endl; + return 0; + } + + dumpchangesummary(f, cs); + + fclose(f); + + if (!comparefiles("setnull.dat","setnull.txt")) return 0; + + // report + + if (!main1->isNull("asub")) return 0; + + if (!main1->isSet("asub")) return 0; + + if (!main1->isNull("bsub")) return 0; + + if (!main1->isSet("bsub")) return 0; + +// dol0 is set to null + + if (!dol[0]->isNull("name")) return 0; + + if (!dol[0]->isNull("number")) return 0; + + if (!dol[0]->isNull("bool")) return 0; + + if (!dol[0]->isSet("name")) return 0; + + if (!dol[0]->isSet("number")) return 0; + + if (!dol[0]->isSet("bool")) return 0; + +// dol1 is all unset except bool which is null + + if (dol[1]->isNull("name")) return 0; + + if (dol[1]->isNull("number")) return 0; + + if (!dol[1]->isNull("bool")) return 0; + + if (dol[1]->isSet("name")) return 0; + + if (dol[1]->isSet("number")) return 0; + + if (!dol[1]->isSet("bool")) return 0; + +// dol2 is all set non-null, so all set + + if (dol[2]->isNull("name")) return 0; + + if (dol[2]->isNull("number")) return 0; + + if (dol[2]->isNull("bool")) return 0; + + if (!dol[2]->isSet("name")) return 0; + + if (!dol[2]->isSet("number")) return 0; + + if (!dol[2]->isSet("bool")) return 0; + + + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in setnull" << e << endl; + return 0; + } +} + + +int sdotest::testsubs() +{ + + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("companyNS","MainType"); + + mdg->addType("companyNS","SubType"); + mdg->addType("companyNS","SuperType"); + mdg->addType("companyNS","SubstituteType"); + mdg->addType("companyNS","UnrelatedType"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tmain = mdg->getType("companyNS","MainType"); + const Type& sub = mdg->getType("companyNS","SubType"); + const Type& super = mdg->getType("companyNS","SuperType"); + const Type& subst = mdg->getType("companyNS","SubstituteType"); + const Type& unrel = mdg->getType("companyNS","UnrelatedType"); + + + mdg->addPropertyToType(tmain,"name",tstring); + mdg->addPropertyToType(tmain,"sub",super, false); + mdg->addPropertyToType(tmain,"subs",super, true); + + + mdg->setPropertySubstitute(tmain, "sub","wilbur", subst); + mdg->setPropertySubstitute(tmain, "subs","wilburs", subst); + + mdg->setBaseType(sub,super); + + //now sub and subs should accept all the three types + + DataObjectPtr main = mdg->create((Type&)tmain); + main->setCString("name","SubstituteTest"); + + DataObjectList& dol = main->getList("subs"); + + DataObjectPtr sub1 = mdg->create(sub); + DataObjectPtr super1 = mdg->create(super); + DataObjectPtr subst1 = mdg->create(subst); + DataObjectPtr unrel1 = mdg->create(unrel); + + dol.append(sub1); + dol.append(super1); + dol.append(subst1); + try + { + dol.append(unrel1); + return 0; + } + catch (SDOInvalidConversionException e) + { + //cout << "Normal failure to append wrong type" << endl; + } + + dol.remove(0); + dol.remove(0); + dol.remove(0); + + DataObjectList& dol2 = main->getList("wilburs"); + + dol2.append(sub1); + dol2.append(super1); + dol2.append(subst1); + try + { + dol2.append(unrel1); + return 0; + } + catch (SDOInvalidConversionException e) + { + //cout << "Normal failure to append wrong type" << endl; + } + + main->setDataObject("sub",sub1); + main->setDataObject("sub",super1); + main->setDataObject("sub",subst1); + + main->setDataObject("wilbur",sub1); + main->setDataObject("wilbur",super1); + main->setDataObject("wilbur",subst1); + + try + { + main->setDataObject("sub", unrel1); + return 0; + } + catch (SDOInvalidConversionException e) + { + //cout << "Normal failure to set wrong type" << endl; + } + return 1; + } + + catch (SDORuntimeException e) + { + if (!silent)cout << "Substitute test failed" << endl << e << endl; + return 0; + } +} + + +int sdotest::merle1() +{ + + try { + + // Dynamic setup of the metadata + + FILE *f = fopen("merle1.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open merle1.dat" << endl; + return 0; + } + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("axis.xsd"); + + // or dynamically create, but that would get attributes for the strings, not elements + //mdg->addType("axis","ItemSearch",true); // sequenced + //mdg->addType("axis","ItemSearchRequest",true); // sequenced + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tsearch = mdg->getType("axis","ItemSearch"); + const Type& treq = mdg->getType("axis","ItemSearchRequest"); + + //mdg->addPropertyToType(tsearch,"SubscriptionId",tstring); + //mdg->addPropertyToType(tsearch,"AssociateTag",tstring); + //mdg->addPropertyToType(tsearch,"XMLEscaping",tstring); + //mdg->addPropertyToType(tsearch,"Validate",tstring); + //mdg->addPropertyToType(tsearch,"Shared",treq, false, false, true); + //mdg->addPropertyToType(tsearch,"Request",treq, true, false, true); + + //mdg->addPropertyToType(treq,"Keywords",tstring); + //mdg->addPropertyToType(treq,"SearchIndex",tstring); + + // dynamic creation of the data + + DataObjectPtr search = mdg->create((Type&)tsearch); + + search->setCString("SubscriptionId","I am the subscription ID string"); + search->setCString("AssociateTag","I am the associate Tag string"); + search->setCString("XMLEscaping","I am the XML escaping string"); + search->setCString("Validate","I am the Validate string"); + + DataObjectPtr shared = search->createDataObject("Shared"); + shared->setCString("Keywords","SharedKeywordsString"); + shared->setCString("SearchIndex","SearchIndexString"); + + DataObjectList& requests = search->getList("Request"); + DataObjectPtr request1 = mdg->create(treq); + requests.append(request1); + request1->setCString("Keywords","RequestKeywords"); + request1->setCString("SearchIndex","RequestSearchIndex"); + + // Read the data and put it into XML: + + PropertyList properties = search->getInstanceProperties(); + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + + for (int i=0;i<properties.size();i++) + { + Property& prop = properties[i]; + switch (prop.getTypeEnum()) + { + + case Type::StringType: + fprintf(f,"<%s>%s</%s>\n",prop.getName(), search->getCString(prop), + prop.getName()); + break; + + case Type::DataObjectType: + if (prop.isMany()) + { + // many valued property, such as Requests , so get the list + DataObjectList& rq = search->getList(prop); + for (int j=0;j<rq.size();j++) + { + DataObjectPtr dob = rq[j]; + if (dob != 0) + { + XMLDocumentPtr doc = myXMLHelper->createDocument(dob, + "axis", prop.getName()); + doc->setXMLDeclaration(false); + char* dobXML = myXMLHelper->save(doc); + fprintf(f,"DataObject \"%s\" as XML:\n",prop.getName()); + fprintf(f,"%s\n", dobXML); + } // if dob + } // for + } // if many + else + { + DataObjectPtr dob = search->getDataObject(prop); + if (dob != 0) + { + XMLDocumentPtr doc = myXMLHelper->createDocument(dob, + "axis", prop.getName()); + doc->setXMLDeclaration(false); + char* dobXML = myXMLHelper->save(doc); + fprintf(f,"DataObject \"%s\" as XML:\n",prop.getName()); + fprintf(f, "%s\n", dobXML); + } // if + } // else + break; + + default: + break; + + } // switch + } // for + fclose(f); + return comparefiles("merle1.dat","merle1.txt"); + } // try + catch (SDORuntimeException e) + { + if (!silent)cout << "Merle 1 failed" << endl << e << endl; + return 0; + } +} + + +int sdotest::graham3() +{ + try { + + // Dynamic setup of the metadata + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("graham3.xsd"); + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Graham1 failed " << e << endl; + return 0; + } +} + +int sdotest::graham1() +{ + try { + + // Dynamic setup of the metadata + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("graham1.xsd"); + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Graham1 failed " << e << endl; + return 0; + } +} +int sdotest::graham2() +{ + try { + + // Dynamic setup of the metadata + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("graham2.xsd"); + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Graham2 failed " << e << endl; + return 0; + } +} + + +int sdotest::b46613() +{ + try { + + // Dynamic setup of the metadata + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->create("rubbish","MyObject"); + + return 0; + + } + catch (SDOTypeNotFoundException e) + { + //cout << "b46613 gave the correct exception" << endl; + return 1; + } +} + +int sdotest::doctest() +{ + try { + + FILE *f = fopen("doctest.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open doctest.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("doctest.xsd"); + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("doctest.xml", + "companyNS"); + fprintf(f,"RootURI=%s\n",myXMLDocument->getRootElementURI()); + fprintf(f,"RootName=%s\n",myXMLDocument->getRootElementName()); + fclose(f); + return comparefiles("doctest.dat","doctest.txt"); + } + catch (SDOTypeNotFoundException e) + { + if (!silent)cout << "doctest failed" << endl; + return 0; + } + +} + + +int sdotest::b46634() +{ + try { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("company_with_nillable_SN.xsd"); + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("company_with_nillable_SN.xml", + "companyNS"); + + DataObjectPtr dob = myXMLDocument->getRootDataObject(); + DataObjectList& dol = dob->getList("departments"); + DataObjectPtr dept = dol[0]; + DataObjectList& dol2 = dept->getList("employees"); + DataObjectPtr emp = dol2[0]; + + if (!emp->isSet("SN")) + { + if (!silent)cout << "B46634 WRONG - isSet should be true" << endl; + return 0; + } + if (!emp->isNull("SN")) + { + if (!silent)cout << "B46634 WRONG - isNull should be true" << endl; + return 0; + } + + // now write out the nill value and check its still nil + myXMLHelper->save(myXMLDocument->getRootDataObject(), + 0, "company", "b46634_out.xml"); + return comparefiles("b46634_out.xml","b46634_out.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "b46634 failed" << endl; + return 0; + } + +} + +int sdotest::testErrors() +{ + try { + + int i,j; + + FILE *f = fopen("testerrors.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open testerrors.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("error1.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + fprintf(f,"XSD reported some errors:\n"); + for (j=0;j<i;j++) + { + const char* m = xsh->getErrorMessage(j); + if (m != 0) fprintf(f,"%s\n", m); + } + } + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("error1.xml", + "companyNS"); + + if ((i = myXMLHelper->getErrorCount()) > 0) + { + fprintf(f,"XML reported some errors:\n"); + for (j=0;j<i;j++) + { + const char *m = myXMLHelper->getErrorMessage(j); + if (m != 0) fprintf(f,"%s\n",m); + } + } + + fclose(f); + return comparefiles("testerrors.dat","testerrors.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "testErrors failed" << endl << e << endl; + return 0; + } + +} + +int sdotest::b46734() +{ + try { + + int i,j; + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("wsdl.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + xsh->defineFile("wsdl-soap.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL SOAP XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char* m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + xsh->defineFile("wsdl-http.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL HTTP XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char* m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("StockQuoteService.wsdl" + ); + + if ((i = myXMLHelper->getErrorCount()) > 0) + { + if (!silent) + { + cout << "XML reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char * m = myXMLHelper->getErrorMessage(j); + if (m != 0)cout << m; + cout << endl; + } + } + return 0; + } + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "b46734 failed" << endl << e << endl; + return 0; + } + +} + +int sdotest::b46693() +{ + try { + + int i,j; + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("b46693.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "b46693 XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char* m = xsh->getErrorMessage(j); + if (m != 0)cout << m; + cout << endl; + } + } + return 0; + } + + // XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + // XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("b46693.xsd" + // ); + + // if ((i = myXMLHelper->getErrorCount()) > 0) + // { + // cout << "b46693 reported some errors:" << endl; + // for (j=0;j<i;j++) + // { + // const char* m = myXMLHelper->getErrorMessage(j); + // if (m != 0)cout << m; + // cout << endl; + // } + // } + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "b46693 failed" << endl << e << endl; + return 0; + } + +} + +int sdotest::clonetest() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("companyNS","CompanyType"); + mdg->addType("companyNS","DepartmentType"); + mdg->addType("companyNS","EmployeeType"); + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + mdg->addPropertyToType(tcomp,"name",tstring); + mdg->addPropertyToType(tcomp,"departments",tdept,true,false,true); + mdg->addPropertyToType(tcomp,"employeeOfTheMonth",temp,false,false,false); + mdg->addPropertyToType(tcomp,"CEO",temp,false,false,true); + + mdg->addPropertyToType(tdept,"employees",temp,true,false,true); + mdg->addPropertyToType(tdept,"name",tstring,false,false,true); + mdg->addPropertyToType(tdept,"location",tstring,false,false,true); + mdg->addPropertyToType(tdept,"number",tstring,false,false,true); + + mdg->addPropertyToType(temp,"name",tstring,false,false,true); + mdg->addPropertyToType(temp,"SN",tstring,false,false,true); + mdg->addPropertyToType(temp,"manager",tbool,false,false,true); + + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","The Company"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","The Department"); + dept->setCString("location","Botley"); + dept->setCString("number","123"); + + + // now clone the data factory, and add more types + + DataFactoryPtr df2 = mdg->clone(); + + df2->addType("otherNS","DataSet"); + + df2->addPropertyToType("companyNS","DepartmentType","dataset", + "otherNS","DataSet", false, false, true); + + const Type& tstring2 = df2->getType("commonj.sdo","String"); + const Type& tbool2 = df2->getType("commonj.sdo","Boolean"); + const Type& tcs2 = df2->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp2 = df2->getType("companyNS","CompanyType"); + const Type& tdept2 = df2->getType("companyNS","DepartmentType"); + const Type& temp2 = df2->getType("companyNS","EmployeeType"); + + DataObjectPtr comp2 = df2->create((Type&)tcomp2); + comp->setCString("name","The Company"); + + DataObjectPtr dept2 = df2->create((Type&)tdept2); + + DataObjectList& dol2 = comp2->getList("departments"); + dol2.append(dept2); + + dept2->setCString("name","The Other Department"); + dept2->setCString("location","Not Botley"); + dept2->setCString("number","321"); + + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "clone failed " << e << endl; + return 0; + } + + +} + +int sdotest::testUtil() +{ + try { + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + + mdg->addType("companyNS","CompanyType"); + // employee will be an open type... + mdg->addType("companyNS","EmployeeType", /*seq*/false, + /*open*/true, + /*abs */ false, + /*data*/ false); + + mdg->addType("companyNS","DepartmentType"); + + mdg->addType("companyNS","OpenType"); + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + const Type& topen = mdg->getType("companyNS","OpenType"); + + + mdg->addPropertyToType(tcomp,"name",tstring); + // not containment... + mdg->addPropertyToType(tcomp,"employeeOfTheMonth",temp, false,false,false); + mdg->addPropertyToType(tcomp,"departments",tdept, true); + mdg->addPropertyToType(tcomp,"cs",tcs); + + mdg->addPropertyToType(tdept,"name",tstring); + mdg->addPropertyToType(tdept,"location",tstring); + mdg->addPropertyToType(tdept,"number",tstring); + mdg->addPropertyToType(tdept,"employees",temp,true); + + mdg->addPropertyToType(temp, "name",tstring); + mdg->addPropertyToType(temp, "SN", tstring); + mdg->addPropertyToType(temp, "manager", tbool); + + mdg->addPropertyToType(topen,"name",tstring); + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","ACME"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","Advanced Technologies"); + dept->setCString("location","NY"); + dept->setCString("number","123"); + + DataObjectList& emps = dept->getList("employees"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + + emps.append(emp1); + emps.append(emp2); + emps.append(emp3); + + emp1->setCString("name","Albert"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Boris"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Carl"); + emp3->setCString("SN","E0003"); + + emp1->setCString("openstring","Value Of Open String"); + emp1->setBoolean("openboolean",true); + + const char* c = emp1->getCString("openstring"); + + bool b = emp1->getBoolean("openboolean"); + + // unknown list type at present.. + DataObjectList& dl = emp1->getList("openintlist"); + + int i = 45; + dl.append((short)i); // now the list must be primitive and short!! + + // unknown list type at present.. + DataObjectList& dl2 = emp1->getList("opendataobjectlist"); + + DataObjectPtr myopen = mdg->create("companyNS","OpenType"); + myopen->setCString("name","MyOpenName"); + dl2.append(myopen); // now the list must be of data objects + + emp1->setDataObject("opendataobject", myopen); + + filebuf fb; + fb.open ("testutils.dat",ios::out); + ostream os(&fb); + SDOUtils::printDataObject(os, comp); + fb.close(); + return comparefiles("testutils.dat","testutils.txt"); + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ERROR in UTILS test" << e << endl; + return 0; + } + +} + +int sdotest::printset(FILE *f, ChangeSummaryPtr cs) +{ + ChangedDataObjectList& cdl = cs->getChangedDataObjects(); + + // here there should be a creation of Ed, and a change to dept, which has a + // bool previously unset, and a int list previuously unset and an employees list + // previously unset + + for (int i=0;i< cdl.size();i++) + { + if (cs->isModified(cdl[i])) + { + + fprintf(f,"A modified of type %s#%s\n",cdl[i]->getType().getURI() + ,cdl[i]->getType().getName()); + + SettingList& sl = cs->getOldValues(cdl[i]); + if (sl.size() == 0) + { + fprintf(f,"No Settings found\n"); + } + else + { + for (int j=0;j< sl.size(); j++) + { + fprintf(f,"Property %s",sl[j].getProperty().getName()); + // this could be a many-valued property, and could be one which is + // a data object or a data type... + if (sl[j].getProperty().isMany()) + { + fprintf(f,"[%s]",sl[j].getIndex()); + } + if (!sl[j].isSet()) + { + fprintf(f," was unset before the change\n"); + } + else + { + fprintf(f," was set before the change !!\n"); + } + } + } + } + } + return 1; +} + + +int sdotest::b46633() +{ + try { + + FILE *f = fopen("b46633.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open b46633.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addPropertyToType("myspace","Root","cs", + "commonj.sdo","ChangeSummary", false, false, false); + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Department"); + mdg->addType("myspace","Manager"); + mdg->addType("myspace","Employee"); + + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","Root","company", + "myspace","Company", false, false, true); + + mdg->addPropertyToType("myspace","Company","departments", + "myspace","Department", true, false, true); + + + mdg->addPropertyToType("myspace","Department","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Department","ints", + "commonj.sdo","Integer", true, false, false); + + + mdg->addPropertyToType("myspace","Department","bool", + "commonj.sdo","Boolean", false, false, false); + + mdg->addPropertyToType("myspace","Department","manager", + "myspace","Manager", false, false, true); + + mdg->addPropertyToType("myspace","Department","employees", + "myspace","Employee", true, false, true); + + mdg->addPropertyToType("myspace","Manager","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Employee","name", + "commonj.sdo","String", false, false, false); + + const Type& tcc = mdg->getType("myspace","Root"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + + ChangeSummaryPtr cs = dor->getChangeSummary(); + + DataObjectPtr com = dor->createDataObject("company"); + com->setCString("name","IBM"); + + DataObjectPtr dept = com->createDataObject("departments"); + dept->setCString("name","JTC"); + + // employees initally unset + + cs->beginLogging(); + + DataObjectPtr emp = dept->createDataObject("employees"); + emp->setCString("name","Ed"); + + + + DataObjectList& dl = dept->getList("ints"); + dl.append((long)400); + + dept->setBoolean("bool", true); + + printset(f,cs); + + cs->endLogging(); + + // unset them all , restart logging, and get the same results + + dept->unset("bool"); + dept->unset("ints"); + dept->unset("employees"); + + cs->beginLogging(); + + DataObjectPtr emp2 = dept->createDataObject("employees"); + emp2->setCString("name","Ed2"); + + dl.append((long)600); + + dept->setBoolean("bool", true); + + printset(f, cs); + + cs->endLogging(); + + fclose(f); + + return comparefiles("b46633.dat","b46633.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "b46633 failed " << e << endl; + return 0; + } + +} + + + +int sdotest::testLoad() +{ + try + { + int i,j; + DataFactoryPtr mdg = DataFactory::getDataFactory(); + FILE* f = fopen("company_with_nillable_SN.xsd","r+"); + char* buffer = new char[4000]; + j = 0; + while ((i = fgetc(f)) != EOF) + { + buffer[j++] = (char)i; + } + buffer[j] = 0; + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->define(buffer); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) { + cout << "XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + FILE* f2 = fopen("company_with_nillable_SN.xml","r+"); + j = 0; + while ((i = fgetc(f2)) != EOF) + { + buffer[j++] = (char)i; + } + buffer[j] = 0; + + XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr myXMLDocument = myXMLHelper->load(buffer); + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in testDAS " << e << endl; + return 0; + } +} + +int sdotest::includetest() +{ + try + { + int i,j; + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("include.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "INCLUDE XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + xsh->defineFile("../test/test/includeother.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "INCLUDE XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in include test" << e << endl; + return 0; + } +} + +int sdotest::detachtest() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + + mdg->addType("myspace","Company"); + mdg->addType("myspace","Department"); + mdg->addType("myspace","Manager"); + mdg->addType("myspace","Employee"); + + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","Root","company", + "myspace","Company", false, false, true); + + mdg->addPropertyToType("myspace","Company","departments", + "myspace","Department", true, false, true); + + + mdg->addPropertyToType("myspace","Department","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","Department","manager", + "myspace","Manager", false, false, true); + + mdg->addPropertyToType("myspace","Department","employees", + "myspace","Employee", true, false, true); + + mdg->addPropertyToType("myspace","Manager","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Employee","name", + "commonj.sdo","String", false, false, false); + + const Type& tcc = mdg->getType("myspace","Root"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectPtr com = dor->createDataObject("company"); + com->setCString("name","IBM"); + + DataObjectPtr dept = com->createDataObject("departments"); + + dept->setCString("name","JTC"); + + + DataObjectPtr emp = dept->createDataObject("employees"); + emp->setCString("name","Ed"); + + DataObjectPtr emp2 = dept->createDataObject("employees"); + emp2->setCString("name","Tom"); + + DataObjectList& dol = dept->getList("employees"); + + DataObjectPtr e = dol[0]; + e->detach(); + + DataObjectPtr cont = emp->getContainer(); + + if (cont != 0) + { + if (!silent)cout << "EMP STILL ATTACHED - problem" << endl; + return 0; + } + + DataObjectPtr cont2 = dol[0]->getContainer(); + + if (cont2 == 0) + { + if (!silent)cout << "SECOND DETACHED - problem" << endl; + return 0; + } + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "detach failed " << e << endl; + return 0; + } + +} + + +int sdotest::leak() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + + + mdg->addPropertyToType("myspace","Root","ints", + "commonj.sdo","Integer", true, false, false); + + + const Type& tcc = mdg->getType("myspace","Root"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + + + if (dor->isSet("ints")) return 0; + + DataObjectList& dl = dor->getList("ints"); + + if (dor->isSet("ints")) return 0; + + dl.append((long)400); + + if (!dor->isSet("ints")) return 0; + + dl.remove(0); + + if (dor->isSet("ints")) return 0; + + dl.append((long)400); + + if (!dor->isSet("ints")) return 0; + + dor->unset("ints"); + + if (dor->isSet("ints")) return 0; + + dl.append((long)600); + + if (!dor->isSet("ints")) return 0; + + return 1; + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "leak failed " << e << endl; + return 0; + } + +} + +int sdotest::twolists() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + + mdg->addPropertyToType("myspace","Root","ints", + "commonj.sdo","Integer", true, false, false); + + mdg->addPropertyToType("myspace","Root","ints2", + "commonj.sdo","Integer", true, false, false); + + + const Type& tcc = mdg->getType("myspace","Root"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectList& dl2 = dor->getList("ints2"); + dl2.append((long)400); + + + DataObjectList& dl = dor->getList("ints"); + dl.append((long)400); + return 1; + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "twolists failed " << e << endl; + return 0; + } + +} + + +int sdotest::graham4() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addType("myspace","ListItem"); + + + mdg->addPropertyToType("myspace","ListItem","name", + "commonj.sdo","String", false, false, false); + + + mdg->addPropertyToType("myspace","Root","ints", + "commonj.sdo","Integer", true, false, false); + + mdg->addPropertyToType("myspace","Root","items", + "myspace","ListItem", true, false, true); + + + const Type& tcc = mdg->getType("myspace","Root"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + + + // first try with no elements in lists + + try { + DataObjectPtr pitem = dor->getDataObject("items[name=\"hello\"]"); + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + //cout << "Normal exception in Graham4" << endl; + } + + try { + int inty = dor->getInteger("ints[1]"); + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + //cout << "Normal exception in Graham4" << endl; + } + + // now populate them + + DataObjectPtr myitem = dor->createDataObject("items"); + myitem->setCString("name","not hello"); + + try { + DataObjectPtr pitem2 = dor->getDataObject("items[name=\"hello\"]"); + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + //cout << "Normal exception in Graham4" << endl; + } + + DataObjectList& dl = dor->getList("ints"); + dl.append((long)100); + + try { + int inty2 = dor->getInteger("ints[2]"); + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + //cout << "Normal exception in Graham4" << endl; + } + + try + { + DataObjectPtr pitem2 = dor->getDataObject("items[name=\"not hello\"]"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "ABNORMAL exception in Graham4" << endl; + return 0; + } + + try { + int inty2 = dor->getInteger("ints[1]"); + //cout << "Integer is " << inty2 << endl; + return 1; + } + catch (SDOIndexOutOfRangeException e) + { + + if (!silent)cout << "ABNORMAL exception in Graham4" << endl; + return 0; + } + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "twolists failed " << e << endl; + return 0; + } + +} + + +int sdotest::graham5() +{ + try + { + int i,j; + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("Order.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "INCLUDE XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + return 1; + } + catch (SDORuntimeException r) + { + if (!silent)cout << "Graham5 failed " << r << endl; + return 0; + } +} + +int sdotest::graham6() +{ + try + { + int i,j; + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("g/Order.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "INCLUDE XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->loadFile("g/order.xml", "orderNS"); + + char* str = xmh->save(doc); + FILE* f = fopen("g/string-output.xml","w+"); + if (f != 0) + { + fputs(str,f); + fclose(f); + } + + xmh->save(doc,"g/graham6-output.xml"); + + // now get the root and try that + DataObjectPtr dob = doc->getRootDataObject(); + char* str2 = xmh->save(dob,"orderNS","order"); + FILE* f2 = fopen("g/string-output-2.xml","w+"); + if (f2 != 0) + { + fputs(str2,f2); + fclose(f2); + } + + xmh->save(dob,"orderNS","order", "g/graham6-output-2.xml"); + + if (!comparefiles("g/string-output.xml","g/string-output.txt"))return 0; + if (!comparefiles("g/graham6-output.xml","g/graham6-output.txt")) return 0; + if (!comparefiles("g/string-output-2.xml","g/string-output-2.txt")) return 0; + return 1; + + } + catch (SDORuntimeException r) + { + if (!silent)cout << "Graham6 failed " << r << endl; + return 0; + } +} + +int sdotest::b47137() +{ + + try + { + FILE *f = fopen("b47137.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open b47137.dat" << endl; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("b47137.xsd"); + + DataObjectPtr dob = mdg->create("","guid"); + + const Type& t = dob->getType(); + + PropertyList pl = t.getProperties(); + + for (int i=0;i<pl.size();i++) + { + fprintf(f,"Property:%s\n", pl[i].getName()); + } + + dob->setCString("value","Hello"); + dob->setBoolean("isPermaLink",true); + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + xmh->save(dob,"","fluid","b47137_out.xml"); + + // now try to read back the file .. + + XMLDocumentPtr doc = xmh->loadFile("b47137_out.xml", ""); + + DataObjectPtr dob2 = doc->getRootDataObject(); + + const Type& t2 = dob2->getType(); + + PropertyList pl2 = t2.getProperties(); + + for (int j=0;j<pl2.size();j++) + { + fprintf(f,"Property:%s\n",pl2[j].getName()); + fprintf(f, "Value:%s\n", dob2->getCString(pl2[j])); + } + + fclose(f); + return comparefiles("b47137.dat","b47137.txt"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "B47137 failed " << e << endl; + return 0; + } +} + +int sdotest::b47137b() +{ + int i,j; + try + { + + FILE *f = fopen("b47137b.dat","w+"); + if (f == 0) + { + if (!silent) cout << "Unable to open b47137b.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("b47137b.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "INCLUDE XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl = mdg->getTypes(); + for (int k=0;k<tl.size();k++) + { + fprintf(f,"Type:%s#%s\n",tl[k].getURI(),tl[k].getName()); + } + + DataObjectPtr dob = mdg->create("companyNS","CompanyType"); + + const Type& t = dob->getType(); + + PropertyList pl = t.getProperties(); + + for (int i=0;i<pl.size();i++) + { + fprintf(f, "Property:%s\n",pl[i].getName()); + } + + DataObjectPtr dobguid = dob->createDataObject("guid"); + + dobguid->setCString("value","Wilbur"); + dobguid->setBoolean("isPermaLink",true); + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + xmh->save(dob,"","company","b47137b_out.xml"); + + // now try to read back the file .. + + XMLDocumentPtr doc = xmh->loadFile("b47137b_out.xml", ""); + + DataObjectPtr dob2 = doc->getRootDataObject(); + + const Type& t2 = dob2->getType(); + + PropertyList pl2 = t2.getProperties(); + + for (int j=0;j<pl2.size();j++) + { + + fprintf(f,"Property:%s\n",pl2[j].getName()); + if (!strcmp(pl2[j].getName(),"guid")) + { + DataObjectPtr dobguid2 = dob2->getDataObject("guid"); + if (dobguid2 != 0) + { + fprintf(f,"guid Value:%s\n",dobguid2->getCString("value")); + fprintf(f,"guid isPermaLink:",dobguid2->getCString("isPermaLink")); + } + else + { + fprintf(f,"GUID is empty\n"); + } + } + } + fclose(f); + return comparefiles("b47137b.dat","b47137b.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "B47137b failed " << e << endl; + return 0; + } +} + +int sdotest::b47293() +{ + int i,j,k; + try + { + FILE *f = fopen("b47293.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open b47293.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("47293Catalog.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "47293 XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl = mdg->getTypes(); + for ( k=0;k<tl.size();k++) + { + fprintf(f,"Type:%s#%s",tl[k].getURI(),tl[k].getName()); + } + + xsh->generateFile(tl,"47293Catalog-out.xsd","catalogNS",0); + + DataFactoryPtr mdg2 = DataFactory::getDataFactory(); + + XSDHelperPtr xsh2 = HelperProvider::getXSDHelper(mdg2); + + xsh2->defineFile("47293Catalog-out.xsd"); + + if ((i = xsh2->getErrorCount()) > 0) + { + if (!silent) + { + cout << "47293-out XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh2->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl2 = mdg2->getTypes(); + for (k=0;k<tl2.size();k++) + { + fprintf(f,"Type:%s#%s\n",tl2[k].getURI(),tl2[k].getName()); + } + fclose(f); + return comparefiles("b47293.dat","b47293.txt"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "B47137b failed " << e << endl; + return 0; + } +} + + +int sdotest::b47802() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addType("myspace","ListItem"); + + mdg->addPropertyToType("myspace","Root","ints", + "commonj.sdo","Integer", true, false, false); + + mdg->addPropertyToType("myspace","Root","items", + "myspace","ListItem", true, false, true); + + + const Type& tcc = mdg->getType("myspace","Root"); + const Type& tcl = mdg->getType("myspace","ListItem"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + + DataObjectList& dol1 = dor->getList("ints"); + + DataObjectList& dol2 = dor->getList("items"); + + + dol1.append((long)34); + dol1.append((long)56); + + DataObjectPtr li1 = mdg->create(tcl); + DataObjectPtr li2 = mdg->create(tcl); + + dol2.append(li1); + dol2.append(li2); + + dor->unset("ints[1]"); // should work + dor->unset("items.0"); // should work + + try { + + dor->unset("ints[2]"); // should not work + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + //cout << "Normal index oor in 47802" << endl; + } + + try { + dor->unset("items.1"); // should not work + return 0; + } + catch (SDOIndexOutOfRangeException e) + { + // cout << "Normal index oor in 47802" << endl; + } + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Problem in b47802" << e << endl; + return 0; + } +} + + +int sdotest::b47663() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + DataFactoryPtr mdg2 = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + mdg->addType("myspace","ListItem"); + mdg->addType("myspace","Item"); + + mdg->addPropertyToType("myspace","Root","itemref", + "myspace","Item", false, false, false); + + mdg->addPropertyToType("myspace","Root","itemcont", + "myspace","Item", false, false, true); + + mdg->addPropertyToType("myspace","Root","items", + "myspace","ListItem", true, false, true); + + mdg2->addType("myspace","Root"); + mdg2->addType("myspace","ListItem"); + mdg2->addType("myspace","Item"); + + mdg2->addPropertyToType("myspace","Root","itemref", + "myspace","Item", false, false, false); + + mdg2->addPropertyToType("myspace","Root","itemcont", + "myspace","Item", false, false, true); + + mdg2->addPropertyToType("myspace","Root","items", + "myspace","ListItem", true, false, true); + + + + const Type& tcc = mdg->getType("myspace","Root"); + const Type& tcl = mdg->getType("myspace","ListItem"); + const Type& tci = mdg->getType("myspace","Item"); + + DataObjectPtr dor = mdg->create((Type&)tcc); + DataObjectPtr it1 = mdg->create((Type&)tci); + DataObjectList& dol1 = dor->getList("items"); + DataObjectPtr li11 = mdg->create(tcl); + DataObjectPtr li12 = mdg->create(tcl); + + + const Type& tcc2 = mdg2->getType("myspace","Root"); + const Type& tcl2 = mdg2->getType("myspace","ListItem"); + const Type& tci2 = mdg2->getType("myspace","Item"); + DataObjectPtr dor2 = mdg2->create((Type&)tcc2); + DataObjectPtr it2 = mdg2->create((Type&)tci2); + DataObjectList& dol2 = dor2->getList("items"); + DataObjectPtr li21 = mdg2->create(tcl2); + DataObjectPtr li22 = mdg2->create(tcl2); + + + try + { + // append from wrong factory to list + dol1.append(li21); + //cout << "ERROR - 47764 should not append from wrong factory" << endl; + //cout << "Updated test case: Correctly used data object from compatible factory" << + // endl; + } + catch (SDOInvalidConversionException e) + { + if (!silent)cout << "ERROR: Incorrect invalid conversion exception" << e << endl; + return 0; + } + + try + { + // add object from wrong factory to reference. + dor2->setDataObject("itemref",it1); + return 0; + } + catch (SDOUnsupportedOperationException e) + { + // expected ,as a reference cannot be outside the graph + } + + try + { + // add object from wrong factory to reference. + dor2->setDataObject("itemcont",it1); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Add contained object from second factory not OK" << endl; + return 0; + } + + + dol2.append(li22); // OK + + try + { + dol2.insert(0,li11); + //cout << "Updated test case: Correctly used data object from compatible factory" << + // endl; + //cout << "ERROR - 47764 should not insert from wrong factory" << endl; + } + catch (SDOInvalidConversionException e) + { + if (!silent)cout << "Incorrect invalid conversion exception" << e << endl; + return 0; + } + + try + { + dol2.setDataObject(0,li12); + //cout << "Updated test case: Correctly used data object from compatible factory" << + // endl; + // cout << "ERROR - 47764 should not set in list from wrong factory" << endl; + } + catch (SDOInvalidConversionException e) + { + if (!silent)cout << "Incorrect invalid conversion exception" << e << endl; + return 0; + } + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Problem in b47663" << e << endl; + return 0; + } +} + + +int sdotest::bunique() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("test","Root"); + mdg->addType("test","Duplicate"); + mdg->addType("nottest","Duplicate"); + mdg->addType("test","Unique"); + mdg->addType("test","Object"); + + mdg->addPropertyToType("test","Root","duplicate", + "test","Duplicate", false, false, true); + + mdg->addPropertyToType("test","Root","duplicate2", + "nottest","Duplicate", false, false, true); + + mdg->addPropertyToType("test","Root","unique", + "test","Unique", false, false, true); + + mdg->addPropertyToType("test","Root","duplicatelist", + "test","Duplicate", true, false, true); + + mdg->addPropertyToType("test","Root","duplicatelist2", + "nottest","Duplicate", true, false, true); + + mdg->addPropertyToType("test","Root","uniquelist", + "test","Unique", true, false, true); + + mdg->addPropertyToType("test","Duplicate","id", + "commonj.sdo","Integer", false, false, false); + + mdg->addPropertyToType("nottest","Duplicate","id", + "commonj.sdo","Integer", false, false, false); + + mdg->addPropertyToType("test","Unique","id", + "commonj.sdo","Integer", false, false, false); + + mdg->addPropertyToType("test","Duplicate","ob", + "test","Object", false, false, true); + + mdg->addPropertyToType("nottest","Duplicate","ob", + "test","Object", false, false, true); + + mdg->addPropertyToType("test","Unique","ob", + "test","Object", false, false, true); + + const Type& troot = mdg->getType("test","Root"); + const Type& tdup1 = mdg->getType("test","Duplicate"); + const Type& tdup2 = mdg->getType("nottest","Duplicate"); + const Type& tuniq = mdg->getType("test","Unique"); + const Type& tob = mdg->getType("test","Object"); + + DataObjectPtr rooty = mdg->create(troot); + + DataObjectPtr dup1 = mdg->create(tdup1); + dup1->setInteger("id",1); + DataObjectPtr dup2 = mdg->create(tdup1); + dup2->setInteger("id",2); + DataObjectPtr dup3 = mdg->create(tdup2); + dup3->setInteger("id",3); + DataObjectPtr dup4 = mdg->create(tdup2); + dup4->setInteger("id",4); + DataObjectPtr uni1 = mdg->create(tuniq); + uni1->setInteger("id",5); + DataObjectPtr uni2 = mdg->create(tuniq); + uni2->setInteger("id",6); + + DataObjectPtr ob1 = mdg->create(tob); + dup1->setDataObject("ob",ob1); + DataObjectPtr ob2 = mdg->create(tob); + dup2->setDataObject("ob",ob2); + DataObjectPtr ob3 = mdg->create(tob); + uni1->setDataObject("ob",ob3); + + DataObjectList& dl1 = rooty->getList("duplicatelist"); + DataObjectList& dl2 = rooty->getList("duplicatelist2"); + DataObjectList& dl3 = rooty->getList("uniquelist"); + + rooty->setDataObject("duplicate",dup1); + dl1.append(dup2); + + rooty->setDataObject("duplicate2",dup3); + dl2.append(dup4); + + rooty->setDataObject("unique",uni1); + + dl3.append(uni2); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + TypeList tl = mdg->getTypes(); + + xsh->generateFile(tl,"bunique-out.xsd","test"); + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + xmh->save(rooty,"","rooty","bunique-out.xml"); + + if (!comparefiles("bunique-out.xsd","bunique-out.txt")) return 0; + if (!comparefiles("bunique-out.xml","bunique-outxml.txt")) return 0; + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Problem in bunique" << e << endl; + return 0; + } +} + +int sdotest::buniqueread() +{ + try { + + int i,j,k; + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("bunique-out.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "47293 XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + return 0; + } + } + + TypeList tl = mdg->getTypes(); + for ( k=0;k<tl.size();k++) + { + //cout << "Type:" << tl[k].getURI() << "#" << tl[k].getName() << endl; + } + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("bunique-out.xml", "rooty"); + + DataObjectPtr rooty = doc->getRootDataObject(); + + xsh->generateFile(tl,"buniqueread-out.xsd","test"); + + xmh->save(rooty,"","rooty","buniqueread-out.xml"); + + return comparefiles("buniqueread-out.xml","buniqueread-out.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Problem in buniqueread" << e << endl; + return 0; + } +} + + +int sdotest::testwsdl() +{ + try { + + int i,j; + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("wsdl.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + + } + return 0; + } + xsh->defineFile("wsdl-soap.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL SOAP XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char* m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + + } + return 0; + } + xsh->defineFile("wsdl-http.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL HTTP XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char* m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl = mdg->getTypes(); + + for (i=0;i<tl.size();i++) + { + //cout << "TYPE:" << tl[i].getURI() << "#" << tl[i].getName() << endl; + } + + DataObjectPtr root = mdg->create("http://schemas.xmlsoap.org/wsdl/","tDefinitions"); + + + DataObjectPtr mess = mdg->create("http://schemas.xmlsoap.org/wsdl/","tMessage"); + mess->setCString("name","testRequest"); + + DataObjectPtr part = mdg->create("http://schemas.xmlsoap.org/wsdl/","tPart"); + part->setCString("name","name"); + part->setCString("type","http://www.w3.org/2001/XMLSchema-instance#string"); + + DataObjectPtr part2 = mdg->create("http://schemas.xmlsoap.org/wsdl/","tPart"); + part2->setCString("name","name"); + part2->setCString("type","http://I want/this/added/to/the/urls#string"); + + + DataObjectList& dol = root->getList("message"); + + dol.append(mess); + + DataObjectList& dol2 = mess->getList("part"); + + dol2.append(part); + dol2.append(part2); + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + xmh->save(root,"","definitions","testwsdl.xml"); + + return comparefiles("testwsdl.xml","testwsdl.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "testwsdl failed" << endl << e << endl; + return 0; + } + +} + + + +int sdotest::travel() +{ + try { + + int i,j; + + FILE *f = fopen("travel.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open travel.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("TravelBookingSchema.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "WSDL XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl = mdg->getTypes(); + + fprintf(f, "*******************************TYPES**********************\n"); + + for (i=0;i<tl.size();i++) + { + fprintf(f,"TYPE:%s#%s\n",tl[i].getURI(),tl[i].getName()); + } + fprintf(f, "*******************************END TYPES******************\n"); + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("TravelBookingUsingSchema.xml"); + + DataObjectPtr rooty = doc->getRootDataObject(); + + fprintf(f, "*******************************DATA**********************\n"); + printDataObject(f, rooty); + fprintf(f,"***************************END DATA**********************\n"); + + fclose(f); + return comparefiles("travel.dat","travel.txt"); + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "travel failed" << endl << e << endl; + return 0; + } + +} + + +int sdotest::oddchars() +{ + try { + + int i,j; + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("OddChars.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "ODDCHARS XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("OddChars.xml"); + + if ((i = xmh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "OddChars reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + DataObjectPtr rooty = doc->getRootDataObject(); + + FILE *f = fopen ("oddchars.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open oddchars.dat" << endl; + return 0; + } + printDataObject(f, rooty); + + fclose(f); + return comparefiles("oddchars.dat","oddchars.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "oddchars failed" << endl << e << endl; + return 0; + } + +} + +int sdotest::unsetlist() +{ + try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("test","Root"); + mdg->addType("test","ListItem"); + + mdg->addPropertyToType("test","Root","list", + "test","ListItem", true, false, true); + + const Type& troot = mdg->getType("test","Root"); + const Type& tlist = mdg->getType("test","ListItem"); + + DataObjectPtr rooty = mdg->create(troot); + + DataObjectList& dl = rooty->getList("list"); + + + DataObjectPtr li1 = mdg->create(tlist); + DataObjectPtr li2 = mdg->create(tlist); + DataObjectPtr li3 = mdg->create(tlist); + + + dl.append(li1); + dl.append(li2); + dl.append(li3); + + rooty->unset("list[3]"); + + dl.append(li3); + + rooty->unset("list.2"); + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Problem in unsetlist" << e << endl; + return 0; + } +} + + +int sdotest::notns() +{ + try { + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + + mdg->addType("","Root"); + mdg->addType("","ListItem"); + + mdg->addPropertyToType("","Root","list", + "","ListItem", true, false, true); + + const Type& troot = mdg->getType("","Root"); + const Type& tlist = mdg->getType("","ListItem"); + + DataObjectPtr rooty = mdg->create(troot); + + DataObjectList& dl = rooty->getList("list"); + + + DataObjectPtr li1 = mdg->create(tlist); + DataObjectPtr li2 = mdg->create(tlist); + DataObjectPtr li3 = mdg->create(tlist); + + + dl.append(li1); + dl.append(li2); + dl.append(li3); + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + xmh->save(rooty,"","root","notns.xml"); + + return comparefiles("notns.xml","notns.txt"); + + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "notns" << endl << e << endl; + return 0; + } + +} + +int sdotest::badelement() +{ + try { + + int i,j; + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("BadElement.xsd"); + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: BADELEMENT XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("BadElement.xml"); + + if ((i = xmh->getErrorCount()) > 0) + { + FILE *f = fopen("badelement.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open badelement.dat" << endl; + return 0; + } + fprintf(f,"BADELEMENT correctly found errors:\n"); + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) fprintf(f,"%s\n", m); + } + fclose (f); + return comparefiles("badelement.dat","badelement.txt"); + } + else + { + if (!silent)cout << "Expected errors, got none" << endl; + return 0; + } + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "badelement" << endl << e << endl; + return 0; + } + +} + + +int sdotest::testastyle(FILE *f, const char* style) +{ + + int i,j; + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile(style); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: TESTSTYLES XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl = mdg->getTypes(); + + fprintf(f,"*****STYLE %s\n",style); + + for (i=0;i<tl.size();i++) + { + fprintf(f,"Type: %s#%s\n", tl[i].getURI(),tl[i].getName()); + if (!strcmp(tl[i].getName(),"library")) + { + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f,"Property:%s\n",pl[j].getName()); + } + } + } + + fprintf(f, "*************\n"); + + // now try creating elements... + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->createDocument(); // with no name, URI - uses first in schema + + DataObjectPtr root = doc->getRootDataObject(); + + fprintf(f,"Root is:%s#%s\n",root->getType().getURI(), + root->getType().getName()); + + + XMLDocumentPtr doc1 = xmh->createDocument("library"); // with no URI - uses first in schema + + DataObjectPtr root1 = doc1->getRootDataObject(); + + fprintf(f,"Root is:%s#%s\n",root1->getType().getURI(), + root1->getType().getName()); + + XMLDocumentPtr doc2 = xmh->createDocument("library","libraryNS"); // with URI + + DataObjectPtr root2 = doc2->getRootDataObject(); + + fprintf(f, "Root is:%s#%s\n",root2->getType().getURI(), + root2->getType().getName()); + return 1; + + +} + +int sdotest::teststyles() +{ + try + { + + FILE *f = fopen("teststyles.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open teststyles.dat" << endl; + return 0; + } + testastyle(f,"Style1.xsd"); + testastyle(f,"Style2.xsd"); + testastyle(f,"Style3.xsd"); + //testastyle("Style4.xsd"); = groups not supported yet. + fclose(f); + return comparefiles("teststyles.dat","teststyles.txt"); + } + catch (SDORuntimeException e) + { + if (!silent)cout << "teststyles" << endl << e << endl; + return 0; + } + +} + + +int sdotest::testinc2(const char* inc, const char* name1, const char* name2) +{ + + + int i,j; + + try { + + FILE *f = fopen(name1,"w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open " << name1 << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile(inc); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: TestInc2 XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + TypeList tl = mdg->getTypes(); + + //cout << "***** CALCULATOR ***************************************" << endl; + + for (i=0;i<tl.size();i++) + { + fprintf(f, "Type:%s#%s\n", tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f,"Property:%s\n",pl[j].getName()); + } + } + + //cout << "*******************************END TYPES******************" << endl; + fclose(f); + return comparefiles((char*)name1, (char*)name2); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in testinc2" << endl; + return 0; + } + +} + + + +int sdotest::b48300() +{ + return testany("bug48300.xsd",0,"bug48300.xml",0); +} + + +int sdotest::testOrder(const char* x1, const char* x2, const char* name1, + const char* name2) +{ + + int i,j; + + try { + + FILE *f = fopen(name1,"w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open " << name1 << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile(x1); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: Order XSD1 reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + fclose(f); + return 0; + } + + xsh->defineFile(x2); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: Order XSD2 reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + fclose(f); + return 0; + } + + TypeList tl = mdg->getTypes(); + + //cout << "***** TESTORDER ****************************************" << endl; + + for (i=0;i<tl.size();i++) + { + if (!strcmp(tl[i].getURI(),"commonj.sdo")) continue; + fprintf(f,"Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f,"Property:%s\n", pl[j].getName()); + } + } + + //cout << "*******************************END TYPES******************" << endl; + + fclose(f); + return comparefiles((char*)name1, (char*)name2); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in TestOrder" << e << endl; + return 0; + } +} + +int sdotest::simple() +{ + + + int i,j; + + try { + + FILE *f = fopen("simple.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open simple.dat" << endl; + return 0; + } + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("simple.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: Order simple.xsd reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + + TypeList tl = mdg->getTypes(); + + //cout << "***** SIMPLE ****************************************" << endl; + + for (i=0;i<tl.size();i++) + { + if (!strcmp(tl[i].getURI(),"commonj.sdo")) continue; + fprintf(f, "Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f,"Property:%s\n",pl[j].getName()); + fprintf(f, "Type of property:%s\n",pl[j].getType().getName()); + fprintf(f, "IsMany?%d\n",pl[j].isMany()); + } + } + + //cout << "*******************************SIMPLE******************" << endl; + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("simple.xml"); + + if ((i = xmh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "Simple found errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + DataObjectPtr dob = doc->getRootDataObject(); + + printDataObject(f, dob); + + fclose(f); + return comparefiles("simple.dat","simple.txt"); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in TestAny" << e << endl; + return 0; + } +} + + + + + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest.h b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest.h new file mode 100644 index 0000000000..aaf309e2de --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest.h @@ -0,0 +1,192 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: sdotest.h,v 1.21 2006/03/16 12:21:04 slattery Exp $ */ + +#include "commonj/sdo/SDO.h" +using namespace commonj::sdo; + + +// test + +class sdotest { + public: + + static bool silent; + static bool ramping; + + /* utilities */ + + static int printseq(FILE *f, SequencePtr sptr); + static void printDataStructure(FILE *f,DataFactory* dd); + static void printDataObject(FILE *f, DataObjectPtr dol); + static void printValue(FILE *f, DataObjectPtr dob, const Property& prop); + static void printList(FILE *f, DataObjectPtr dob, const Property& prop); + static void printOldValues(FILE *f, ChangeSummaryPtr cs, DataObjectPtr dob); + static void dumpchangesummary(FILE *f, ChangeSummaryPtr cs); + static int comparefiles(char* fn1, char*fn2); + static int dumpproperties(FILE *f, DataObjectPtr root); + static int printset(FILE *f, ChangeSummaryPtr cs); + + static int xsdtosdo(); + + static void changeSummaryHeader(ChangeSummaryPtr cs); + static void changeSummaryFooter(); + static void changeSummaryChange(int level, ChangeSummaryPtr cs, DataObjectPtr dob); + static void changeSummaryDeletedObject(int indent, const char* name, ChangeSummaryPtr cs, DataObjectPtr dob); + static void changeSummaryElements(int indent, ChangeSummaryPtr cs, DataObjectPtr dob); + static void changeSummarySetting(Setting& s); + static bool changeSummaryAttributes(ChangeSummaryPtr cs, DataObjectPtr dol); + static char* convert(const char* uri); + + /* work in progress - generation of structures */ + + static void generate(DataFactoryPtr fac); + + /* tests */ + static int xhtml1(); + static int definetest(); + static int stocktest(); + + static int scopetest(); + static DataObjectPtr scopetest2(); + + + static int pete(); + static int testgenerate(const char* xsd, const char* output); + static int emptycs(); + static int compatiblefactory(); + static int transferto(DataObjectPtr d, DataFactoryPtr f, bool expecterror); + static int openseq(); + static int testanytwo(const char* xsd, + const char* xsd2, const char* xml); + static int testany(const char* xsd, + const char* acceptedxsderror, + const char* xml, + const char* acceptedxmlerror); + static int testOrder(const char* x1, const char* x2, + const char* name1, const char* name2); + static int simple(); + static int testinc2(const char* inc, const char* name1, + const char* name2); + static int testastyle(FILE *f, const char* style); + static int teststyles(); + static int badelement(); + static int oddchars(); + static int notns(); + static int unsetlist(); + static int travel(); + static int testwsdl(); + static int bunique(); + static int buniqueread(); + static int propdefaulttest(); + static int showdefault(FILE *f, const Type& tm); + static int graham6(); + static int graham5(); + static int graham4(); + static int leak(); + static int twolists(); + static int detachtest(); + static int includetest(); + static int testLoad(); + static int clonetest(); + static int testUtil(); + static int testErrors(); + static int doctest(); + static int notfound(); + static int serializeChangeSummary(ChangeSummaryPtr cs); + static int cssave(); + static int csload(); + static int cssave2(); + static int csload2(); + static int bug1(); + static int bug2(); + static int setnull(); + static int testsubsload(); + static int testabstract(); + static int testsubs(); + static int testSCA(); + static int testOpen(); + static int saveOpen(); + static int loadOpen(); + static int testui(); + static int merle1(); + static int graham1(); + static int graham2(); + static int graham3(); + static int loadManyOpen(); + static int loadOpenNS(); + + + static int eqhelpertest(); + static int cohelpertest(); + static int datetest(); + static int matttest1(); + static int adddeletetest(); + static int carotest3(); + static int carotest2(); + static int carotest(); + static int setmany(); + static int noncontest(); + static int versiontest(); + static int defaulttest(); + static int defaulttest_strobj(); + static int querytest(); + static int getproptest(); + static int nulltest(); + static int usertest(); + static int rcptest(); + static int boolbug(); + static int scope1(); + static int scope2(); + static int scope3(); + static int conversiontest(); + static int changesummarytest(); + static int scenario1(); + static int scenario2(); + static int scenario3(); + static int scenario4(); + static int scenario5(); + static int seqtest(); + static int printDataObject(DataObjectPtr dol); + static int printValue(DataObjectPtr dob, const Property& prop); + static int printList(DataObjectPtr dob, const Property& prop); + static int printOldValues(ChangeSummaryPtr cs, DataObjectPtr dob); + static int testGetters(DataObjectPtr dor); + static int testGetter(DataObjectPtr dor, char* str); + static int maintest(); + + static int b48602(); + static int b48736(); + static int b48686(); + static int b48601(); + static int b48300(); + static int b47663(); + static int b47764(); + static int b47802(); + static int b47293(); + static int b47137(); + static int b47137b(); + static int b46633(); + static int b46734(); + static int b46693(); + static int b46634(); + static int b46613(); + static int b46617(); + static int b46617b(); + static int b45933(); +}; diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest2.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest2.cpp new file mode 100644 index 0000000000..28892994cc --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sdotest2.cpp @@ -0,0 +1,1445 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: SdoTest2.cpp,v 1.2 2006/03/16 12:53:57 slattery Exp $ */ + +#include <stdio.h> + +#pragma warning(disable:4786) + +#include <iostream> +#include <fstream> +using namespace std; + + + +#include "sdotest.h" + + + +using namespace commonj::sdo; + +DataObjectPtr sdotest::scopetest2() +{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + mdg->addType("myspace","Root"); + + mdg->addType("myspace","Company"); + + mdg->addPropertyToType("myspace","Company","name", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Company","id", + "commonj.sdo","String", false, false, false); + + mdg->addPropertyToType("myspace","Root","company", + "myspace","Company", false, false, true); + + const Type& tcc = mdg->getType("myspace","Root"); + + DataObjectPtr dop = mdg->create((Type&)tcc); + + DataObjectPtr co = dop->createDataObject("company"); + + return dop; +} + +int sdotest::scopetest() +{ + DataObjectPtr dob; + dob = scopetest2(); + + // fails on close? + return 1; +} + +int sdotest::xsdtosdo() +{ +const char* value; + +value = SDOUtils::XSDToSDO("string"); +if (!silent)cout << "XSDToSDO(string)=" << value << endl; +if (strcmp(value,"String")) return 0; + +value = SDOUtils::XSDToSDO("int"); +if (!silent)cout << "XSDToSDO(int)="<< value << endl; +if (strcmp(value,"Integer")) return 0; + +value = SDOUtils::XSDToSDO("notinlist"); +if (!silent)cout << "XSDToSDO(notinlist)="<< value << endl; +if (strcmp(value,"String")) return 0; + +value = SDOUtils::XSDToSDO(""); +if (!silent)cout << "XSDToSDO(\"\")="<< value << endl; +if (strcmp(value,"String")) return 0; + +value = SDOUtils::XSDToSDO(0); +if (!silent)cout << "XSDToSDO(0)="<< value << endl; +if (strcmp(value,"String")) return 0; + +value = SDOUtils::SDOToXSD("String"); +if (!silent)cout << "SDOToXSD(String)="<< value << endl; +if (strcmp(value,"string")) return 0; + +value = SDOUtils::SDOToXSD("Long"); +if (!silent)cout << "SDOToXSD(Long)="<< value << endl; +if (strcmp(value,"unsignedLong")) return 0; + +value = SDOUtils::SDOToXSD("notinlist"); +if (!silent)cout << "SDOToXSD(notinlist)="<< value << endl; +if (strcmp(value,"string")) return 0; + +value = SDOUtils::SDOToXSD(""); +if (!silent)cout << "SDOToXSD(\"\")="<< value << endl; +if (strcmp(value,"string")) return 0; + +value = SDOUtils::SDOToXSD(0); +if (!silent)cout << "SDOToXSD(0)="<< value << endl; +if (strcmp(value,"string")) return 0; + +return 1; + +} + +int sdotest::compatiblefactory() +{ + DataFactoryPtr f1 = DataFactory::getDataFactory(); + + f1->addType("Namespace","Project"); + f1->addType("Namespace","WorkPackage"); + f1->addType("Namespace","LineItem"); + f1->addType("Namespace","StringHolder"); + + f1->addType("Namespace","Root"); + f1->addPropertyToType("Namespace","Root","project", + "Namespace","Project", false, false, true); + + f1->addPropertyToType("Namespace","StringHolder","value", + "commonj.sdo","String", false, false, false); + + f1->addPropertyToType("Namespace","Project","id", + "commonj.sdo","String", false, false, false); + + f1->addPropertyToType("Namespace","Project","string", + "Namespace","StringHolder", false, false, true); + + f1->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f1->addPropertyToType("Namespace","WorkPackage","string", + "Namespace","StringHolder", false, false, true); + + f1->addPropertyToType("Namespace","LineItem","itemname", + "commonj.sdo","String", false, false, false); + + f1->addPropertyToType("Namespace","LineItem","string", + "Namespace","StringHolder", false, false, true); + + f1->addPropertyToType("Namespace","Project","packages", + "Namespace","WorkPackage", true, false, true); + + f1->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", true, false, true); + + + // project + // id (string) + // string (StringHolder) + // workpackages (WorkPackage) + + // workpackage + // name (string) + // string (StringHolder) + // lineitems (LineItem) + + // lineitem + // itemname (string) + + + // factories 1 and 2 are compatible + + DataFactoryPtr f2 = DataFactory::getDataFactory(); + + f2->addType("Namespace","Project"); + f2->addType("Namespace","WorkPackage"); + f2->addType("Namespace","LineItem"); + f2->addType("Namespace","StringHolder"); + + f2->addType("Namespace","Root"); + f2->addPropertyToType("Namespace","Root","project", + "Namespace","Project", false, false, true); + + + f2->addPropertyToType("Namespace","StringHolder","value", + "commonj.sdo","String", false, false, false); + + f2->addPropertyToType("Namespace","Project","id", + "commonj.sdo","String", false, false, false); + + f2->addPropertyToType("Namespace","Project","string", + "Namespace","StringHolder", false, false, true); + + f2->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f2->addPropertyToType("Namespace","WorkPackage","string", + "Namespace","StringHolder", false, false, true); + + f2->addPropertyToType("Namespace","LineItem","itemname", + "commonj.sdo","String", false, false, false); + + f2->addPropertyToType("Namespace","LineItem","string", + "Namespace","StringHolder", false, false, true); + + f2->addPropertyToType("Namespace","Project","packages", + "Namespace","WorkPackage", true, false, true); + + f2->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", true, false, true); + + + // factory 3 has no project type + + DataFactoryPtr f3 = DataFactory::getDataFactory(); + + f3->addType("Namespace","WorkPackage"); + f3->addType("Namespace","LineItem"); + f3->addType("Namespace","StringHolder"); + + f3->addType("Namespace","Root"); + f3->addPropertyToType("Namespace","Root","project", + "Namespace","WorkPackage", false, false, true); + + + f3->addPropertyToType("Namespace","StringHolder","value", + "commonj.sdo","String", false, false, false); + + f3->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f3->addPropertyToType("Namespace","WorkPackage","string", + "Namespace","StringHolder", false, false, true); + + f3->addPropertyToType("Namespace","LineItem","itemname", + "commonj.sdo","String", false, false, false); + + f3->addPropertyToType("Namespace","LineItem","string", + "Namespace","StringHolder", false, false, true); + + + f3->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", true, false, true); + + + // factory 4 looks compatible - but stringholder is missing + + DataFactoryPtr f4 = DataFactory::getDataFactory(); + + f4->addType("Namespace","Project"); + f4->addType("Namespace","WorkPackage"); + f4->addType("Namespace","LineItem"); + + f4->addType("Namespace","Root"); + f4->addPropertyToType("Namespace","Root","project", + "Namespace","Project", false, false, true); + + + f4->addPropertyToType("Namespace","Project","id", + "commonj.sdo","String", false, false, false); + + + f4->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f4->addPropertyToType("Namespace","LineItem","itemname", + "commonj.sdo","String", false, false, false); + + f4->addPropertyToType("Namespace","Project","packages", + "Namespace","WorkPackage", true, false, true); + + f4->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", true, false, true); + + + // factory 5 looks compatible, but the lists are not lists + + DataFactoryPtr f5 = DataFactory::getDataFactory(); + + f5->addType("Namespace","Project"); + f5->addType("Namespace","WorkPackage"); + f5->addType("Namespace","LineItem"); + f5->addType("Namespace","StringHolder"); + + f5->addType("Namespace","Root"); + f5->addPropertyToType("Namespace","Root","project", + "Namespace","Project", false, false, true); + + + f5->addPropertyToType("Namespace","StringHolder","value", + "commonj.sdo","String", false, false, false); + + f5->addPropertyToType("Namespace","Project","id", + "commonj.sdo","String", false, false, false); + + f5->addPropertyToType("Namespace","Project","string", + "Namespace","StringHolder", false, false, true); + + f5->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f5->addPropertyToType("Namespace","WorkPackage","string", + "Namespace","StringHolder", false, false, true); + + f5->addPropertyToType("Namespace","LineItem","itemname", + "commonj.sdo","String", false, false, false); + + f5->addPropertyToType("Namespace","LineItem","string", + "Namespace","StringHolder", false, false, true); + + f5->addPropertyToType("Namespace","Project","packages", + "Namespace","WorkPackage", false, false, true); + + f5->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", false, false, true); + + // factory 6 looks OK, but the lineitems have no itemname field + + DataFactoryPtr f6 = DataFactory::getDataFactory(); + + f6->addType("Namespace","Project"); + f6->addType("Namespace","WorkPackage"); + f6->addType("Namespace","LineItem"); + f6->addType("Namespace","StringHolder"); + + f6->addType("Namespace","Root"); + f6->addPropertyToType("Namespace","Root","project", + "Namespace","Project", false, false, true); + + + f6->addPropertyToType("Namespace","StringHolder","value", + "commonj.sdo","String", false, false, false); + + f6->addPropertyToType("Namespace","Project","id", + "commonj.sdo","String", false, false, false); + + f6->addPropertyToType("Namespace","Project","string", + "Namespace","StringHolder", false, false, true); + + f6->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f6->addPropertyToType("Namespace","WorkPackage","string", + "Namespace","StringHolder", false, false, true); + + f6->addPropertyToType("Namespace","LineItem","string", + "Namespace","StringHolder", false, false, true); + + f6->addPropertyToType("Namespace","Project","packages", + "Namespace","WorkPackage", true, false, true); + + f6->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", true, false, true); + + + // factory 7 looks OK, but the identifiers are ints + + + DataFactoryPtr f7 = DataFactory::getDataFactory(); + + f7->addType("Namespace","Project"); + f7->addType("Namespace","WorkPackage"); + f7->addType("Namespace","LineItem"); + f7->addType("Namespace","StringHolder"); + + f7->addType("Namespace","Root"); + f7->addPropertyToType("Namespace","Root","project", + "Namespace","Project", false, false, true); + + f7->addPropertyToType("Namespace","StringHolder","value", + "commonj.sdo","String", false, false, true); + + f7->addPropertyToType("Namespace","Project","id", + "commonj.sdo","Integer", false, false, false); + + f7->addPropertyToType("Namespace","Project","string", + "Namespace","StringHolder", false, false, true); + + f7->addPropertyToType("Namespace","WorkPackage","name", + "commonj.sdo","String", false, false, false); + + + f7->addPropertyToType("Namespace","WorkPackage","string", + "Namespace","StringHolder", false, false, true); + + f7->addPropertyToType("Namespace","LineItem","itemname", + "commonj.sdo","Integer", false, false, false); + + f7->addPropertyToType("Namespace","LineItem","string", + "Namespace","StringHolder", false, false, true); + + f7->addPropertyToType("Namespace","Project","packages", + "Namespace","WorkPackage", true, false, true); + + f7->addPropertyToType("Namespace","WorkPackage","lineitems", + "Namespace","LineItem", true, false, true); + + + // create a tree from Root in factory 1 + + DataObjectPtr root = f1->create("Namespace","Root"); + DataObjectPtr project = root->createDataObject("project"); + project->setCString("id","The TTP Project"); + DataObjectPtr str = project->createDataObject("string"); + str->setCString("value","The Recursive Acronym Project"); + DataObjectPtr wp1 = project->createDataObject("packages"); + DataObjectPtr wp2 = project->createDataObject("packages"); + wp1->setCString("name","Work Package 1"); + wp2->setCString("name","Work Package 2"); + DataObjectPtr li1 = wp1->createDataObject("lineitems"); + DataObjectPtr li2 = wp1->createDataObject("lineitems"); + DataObjectPtr li3 = wp2->createDataObject("lineitems"); + DataObjectPtr li4 = wp2->createDataObject("lineitems"); + li1->setCString("itemname","LineItem 1"); + li2->setCString("itemname","LineItem 2"); + li3->setCString("itemname","LineItem 3"); + li4->setCString("itemname","LineItem 4"); + DataObjectPtr str1 = li1->createDataObject("string"); + DataObjectPtr str2 = li2->createDataObject("string"); + DataObjectPtr str3 = li3->createDataObject("string"); + DataObjectPtr str4 = li4->createDataObject("string"); + str1->setCString("value","String1"); + str2->setCString("value","String2"); + str3->setCString("value","String3"); + str4->setCString("value","String4"); + + +// cout << "DATA OBJECTS FROM FACTORY 1" << endl; +// printDataObject(root); + + if (!transferto(root,f2, false)) return 0; + if (!transferto(root,f3, true)) return 0; + if (!transferto(root,f4, true)) return 0; + if (!transferto(root,f5, true)) return 0; + if (!transferto(root,f6, true)) return 0; + if (!transferto(root,f7, true)) return 0; + + // finally, lets move one which has a parent and cant be moved. + + try { + DataObjectPtr project = root->getDataObject("project"); + + DataObjectPtr root2 = f2->create("Namespace","Root"); + + root2->setDataObject("project", project); + return 0; + } + catch (SDORuntimeException e) + { + //cout << "Compatibility test correctly returned an error :" ; + //cout << e.getMessageText() << endl; + return 1; + } + +} + +int sdotest::transferto(DataObjectPtr root, DataFactoryPtr f2, bool expecterror) +{ + try { + + // transfer the tree to factory 2... + DataObjectPtr rproject = root->getDataObject("project"); + + DataObjectPtr project = CopyHelper::copy(rproject); + + DataObjectPtr root2 = f2->create("Namespace","Root"); + + root2->setDataObject("project", project); + + //cout << "DATA OBJECTS TRANSFERRED" << endl; + + //printDataObject(root2); + + if (expecterror) + { + return 0; + } + return 1; + } + catch (SDORuntimeException e) + { + if (expecterror){ + //cout << "Compatibility test correctly returned an error :" ; + //cout << e.getMessageText() << endl; + return 1; + } + else + { + if (!silent)cout << "Compatibility test failed whilst transferring " << e << endl; + return 0; + } + } +} + + +int sdotest::b48602() +{ + + + int i,j; + + try { + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("b48602.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: b48602 XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + return 0; + } + catch (SDOTypeNotFoundException e) + { + return 1; + } + catch (SDORuntimeException e) + { + return 1; + } + +} + +int sdotest::testany(const char* xsd, + const char* acceptedxsderror, + const char* xml, + const char* acceptedxmlerror) +{ + + + int i,j,rc; + + try { + + char *c; + + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + if (xsd) + { + char * name1 = new char[strlen(xsd)+5]; + char * name3 = new char[strlen(xsd)+5]; + strcpy(name1,xsd); + while ((c = strchr(name1,'.')) != 0)*c = '_'; + strcpy(name3,name1); + strcat(name1,".dat"); + strcat(name3,".txt"); + + + FILE *f1 = fopen(name1,"w+"); + if (f1 == 0) + { + if (!silent)cout << "Unable to open " << name1 << endl; + delete name1; + delete name3; + return 0; + } + + xsh->defineFile(xsd); + + if ((i = xsh->getErrorCount()) > 0) + { + if (acceptedxsderror != 0) + { + for (j=0;j<i;j++) + { + if (!strcmp(acceptedxsderror,xsh->getErrorMessage(j))) + { + fclose(f1); + delete name1; + delete name3; + return 1; + } + } + } + if (!silent) + { + cout << "PROBLEM: Testany XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + fclose(f1); + delete name1; + delete name3; + return 0; + } + + + TypeList tl = mdg->getTypes(); + + fprintf(f1, "***** TYPES BEFORE RESOLVE **********************************\n"); + + for (i=0;i<tl.size();i++) + { + fprintf(f1,"Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f1,"Property:%s ",pl[j].getName()); + if (pl[j].isMany()) + fprintf(f1, "(many) "); + fprintf(f1, " of type %s\n",pl[j].getType().getName()); + } + } + + fprintf(f1, "*******************************END TYPES******************\n"); + + fclose(f1); + + + rc = comparefiles(name1,name3); + + delete name1; + delete name3; + + if (rc == 0)return rc; + + } + + if (xml == 0 || strlen(xml) == 0) return 1; + + char * name2 = new char[strlen(xml)+5]; + char * name4 = new char[strlen(xml)+5]; + strcpy(name2,xml); + while ((c = strchr(name2,'.')) != 0)*c = '_'; + strcpy(name4,name2); + + strcat(name2,".dat"); + strcat(name4,".txt"); + + FILE *f2 = fopen(name2,"w+"); + if (f2 == 0) + { + if (!silent)cout << "Unable to open " << name2 << endl; + delete name2; + delete name4; + return 0; + } + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile(xml); + + if ((i = xmh->getErrorCount()) > 0) + { + if (acceptedxmlerror != 0) + { + for (j=0;j<i;j++) + { + if (!strcmp(acceptedxmlerror,xmh->getErrorMessage(j))) + { + fclose(f2); + delete name2; + delete name4; + return 1; + } + } + } + if (!silent) + { + cout << "TestAny XML found errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + fclose(f2); + delete name2; + delete name4; + return 0; + } + + else { + TypeList tl = mdg->getTypes(); + + fprintf(f2, "***** TYPES AFTER RESOLVE*********************************\n"); + + for (i=0;i<tl.size();i++) + { + fprintf(f2,"Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f2, "Property:%s ",pl[j].getName()); + if (pl[j].isMany()) + fprintf(f2, "(many) "); + fprintf(f2, " of type %s\n",pl[j].getType().getName()); + } + } + + fprintf(f2, "*******************************END TYPES******************\n"); + + + DataObjectPtr dob = doc->getRootDataObject(); + printDataObject(f2, dob); + + fclose(f2); + + rc = comparefiles(name2,name4); + + delete name2; + delete name4; + + return rc; + } + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in TestAny" << e << endl; + return 0; + } +} + + + +int sdotest::testanytwo(const char* xsd, const char* xsd2, + const char* xml) +{ + + + int i,j; + + try { + + char * name1 = new char[strlen(xsd)+5]; + char * name2 = new char[strlen(xml)+5]; + char * name3 = new char[strlen(xsd)+5]; + char * name4 = new char[strlen(xml)+5]; + strcpy(name1,xsd); + strcpy(name2,xml); + char *c; + while ((c = strchr(name1,'.')) != 0)*c = '_'; + while ((c = strchr(name2,'.')) != 0)*c = '_'; + strcpy(name3,name1); + strcpy(name4,name2); + + strcat(name1,".dat"); + strcat(name2,".dat"); + strcat(name3,".txt"); + strcat(name4,".txt"); + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + if (xsd) + { + xsh->defineFile(xsd); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: Testany XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + + } + + if (xsd2) + { + xsh->defineFile(xsd2); + + if ((i = xsh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "PROBLEM: Testany XSD2 reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + } + + if (xsd) + { + + + FILE *f1 = fopen(name1,"w+"); + if (f1 == 0) + { + if (!silent)cout << "Unable to open " << name1 << endl; + return 0; + } + + TypeList tl = mdg->getTypes(); + + fprintf(f1,"***** TESTANY ******************************************\n"); + + for (i=0;i<tl.size();i++) + { + fprintf(f1,"Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + fprintf(f1,"Property:%s ",pl[j].getName()); + if (pl[j].isMany()) + fprintf(f1, "(many) "); + fprintf(f1, " of type %s\n",pl[j].getType().getName()); + } + } + + fprintf(f1,"*******************************END TYPES******************\n"); + + fclose(f1); + + if (!comparefiles(name1,name3)) return 0; + + } + + + if (xml == 0 || strlen(xml) == 0) return 1; + + + FILE *f2 = fopen(name2,"w+"); + if (f2 == 0) + { + if (!silent)cout << "Unable to open " << name2 << endl; + return 0; + } + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile(xml); + + if ((i = xmh->getErrorCount()) > 0) + { + if (!silent) + { + cout << "TestAny XML found errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + else + { + DataObjectPtr dob = doc->getRootDataObject(); + printDataObject(f2, dob); + } + + fclose(f2); + return comparefiles(name2,name4); + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in TestAnyTwo" << e << endl; + return 0; + } +} + +int sdotest::openseq() + +{ + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + FILE *f = fopen("openseq.dat","w+"); + if (f == 0) + { + if (!silent)cout << "Unable to open openseq.dat" << endl; + return 0; + } + + + mdg->addType("companyNS","CompanyType"); + // employee will be an open sequenced type... + mdg->addType("companyNS","EmployeeType", /*seq*/true, + /*open*/true, + /*abs */ false, + /*data*/ false); + + + /* Now add the properties to the types...*/ + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + + mdg->addPropertyToType(tcomp,"name",tstring); + + mdg->addPropertyToType(tcomp,"employees",temp,true); + + mdg->addPropertyToType(temp, "name",tstring); + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","ACME"); + + DataObjectPtr emp = mdg->create(temp); + + emp->setCString("name","Albert"); + + emp->setCString("openstring","Value Of Open String"); + + /* now do the same with the employee seq...*/ + + SequencePtr seq = emp->getSequence(); + + seq->addCString("opensequencedstring","Value of sequenced string"); + + const char* c = emp->getCString("openstring"); + + fprintf(f, "Open Type string value: %s\n",c); + + c = emp->getCString("opensequencedstring"); + + fprintf(f, "Open Sequenced string value: %s\n",c); + + c = seq->getCStringValue(0); + + fprintf(f, "Open Sequenced string value from seq: %s\n",c); + + //cout << "END TEST: OpenSeq ======================================" << endl; + fclose(f); + return comparefiles("openseq.dat","openseq.txt"); +} + +int sdotest::b48601() +{ + return testany("48601.xsd", + "Schema contains a union which is not yet implemented",0,0); +} + +int sdotest::b48686() +{ + return testany("48686.xsd",0,"48686.xml",0); +} + +int sdotest::b48736() +{ + return testany("48736.xsd",0,"48736.xml",0); +} + + +int sdotest::testgenerate(const char* xsd, const char* output) +{ + + int i,j; + + try { + + char * name1 = new char[strlen(output) + 5]; + char * name2 = new char[strlen(output) + 5]; + char * c; + strcpy(name1,output); + while ((c = strchr(name1,'.')) != 0)*c='_'; + strcpy(name2,name1); + strcat(name1,".dat"); + strcat(name2,".txt"); + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + if (xsd) + { + xsh->defineFile(xsd); + + if ((i = xsh->getErrorCount()) > 0) + { + + if (!silent) + { + cout << "PROBLEM: generation XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + return 0; + } + else + { + mdg->generateInterface(name1,"Test"); + return comparefiles(name1,name2); + } + } + return 0; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in TestGenerate" << e << endl; + return 0; + } +} + + +int sdotest::emptycs() +{ +try { + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + xsh->defineFile("company.xsd"); + + + const Type& tstring = mdg->getType("commonj.sdo","String"); + const Type& tbool = mdg->getType("commonj.sdo","Boolean"); + const Type& tcs = mdg->getType("commonj.sdo","ChangeSummary"); + const Type& tcomp = mdg->getType("companyNS","CompanyType"); + const Type& tdept = mdg->getType("companyNS","DepartmentType"); + const Type& temp = mdg->getType("companyNS","EmployeeType"); + + + // create a graph, then save it + + DataObjectPtr comp = mdg->create((Type&)tcomp); + comp->setCString("name","ACME"); + + DataObjectPtr dept = mdg->create((Type&)tdept); + DataObjectList& dol = comp->getList("departments"); + dol.append(dept); + + dept->setCString("name","Advanced Technologies"); + dept->setCString("location","NY"); + dept->setCString("number","123"); + + DataObjectPtr emp1 = mdg->create(temp); + DataObjectPtr emp2 = mdg->create(temp); + DataObjectPtr emp3 = mdg->create(temp); + + emp1->setCString("name","John Jones"); + emp1->setCString("SN","E0001"); + + emp2->setCString("name","Mary Smith"); + emp2->setCString("SN","E0002"); + emp2->setBoolean("manager",true); + + emp3->setCString("name","Jane Doe"); + emp3->setCString("SN","E0003"); + + DataObjectList& dol2 = dept->getList("employees"); + dol2.append(emp1); + dol2.append(emp2); + dol2.append(emp3); + + comp->setDataObject("employeeOfTheMonth",emp2); + + // right now, there is no change summary, and logging is + // off - we expect an empty change summary element + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + XMLDocumentPtr doc = xmh->createDocument(comp,"companyNS","company"); + + xmh->save(doc,"emptycs1.xml"); + + if (!comparefiles("emptycs1.xml","emptycs1.txt"))return 0; + + ChangeSummaryPtr cs = comp->getChangeSummary(); + + cs->beginLogging(); + + xmh->save(doc,"emptycs2.xml"); + + if (!comparefiles("emptycs2.xml","emptycs2.txt"))return 0; + + // now we expect and empty change summary with logging true + + DataObjectPtr emp4 = mdg->create(temp); + emp4->setCString("name","Al Smith"); + emp4->setCString("SN","E0004"); + emp4->setBoolean("manager",true); + + // first change - create employee 4 + dol2.append(emp4); + + cs->endLogging(); + + //serializeChangeSummary(cs); + + xmh->save(doc,"emptycs3.xml"); + + if (!comparefiles("emptycs3.xml","emptycs3.txt"))return 0; + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "empty change summary save failed" << e << endl; + return 0; + } +} + + +int sdotest::definetest() +{ + try { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + TypeDefinitions* ts = new TypeDefinitions(); + if (ts) delete ts; + ts = new TypeDefinitions(); + + + TypeDefinition* td = new TypeDefinition(); + + td->setName("MySmallObject"); + td->setUri("MyNameSpace"); + td->setIsDataType(false); + + TypeDefinition* td2 = new TypeDefinition(); + td2->setName("MyOtherObject"); + td2->setUri("MyNameSpace"); + td2->setIsDataType(false); + + + PropertyDefinition* pd = new PropertyDefinition(); + pd->setName("MyIntegerProperty"); + pd->setType("commonj.sdo","Integer"); + + PropertyDefinition* pd2 = new PropertyDefinition(); + pd2->setName("MyObjectProperty"); + pd2->setType("MyNameSpace","MyOtherObject"); + pd2->setIsMany(true); + + td->addPropertyDefinition(*pd); + + td->addPropertyDefinition(*pd2); + + ts->addTypeDefinition(*td); + ts->addTypeDefinition(*td2); + + // should have an object of type MySmallObject, containing + // a single integer called MyIntegerProperty, and a list of + // objects called MyObjectProperty - of type MyOtherObject + + xsh->defineTypes(*ts); + + delete td; + delete td2; + delete ts; + delete pd; + delete pd2; + + DataObjectPtr dob = mdg->create("MyNameSpace","MySmallObject"); + dob->setInteger("MyIntegerProperty",43); + + dob->createDataObject("MyObjectProperty"); + dob->createDataObject("MyObjectProperty"); + DataObjectList& dl = dob->getList("MyObjectProperty"); + + if (dl.size() != 2) + { + if (!silent) cout << "Define test list size is wrong" << endl; + return 0; + } + int value = dob->getInteger("MyIntegerProperty"); + if (value != 43) + { + if (!silent) cout << "Define test integer value is wrong" << endl; + return 0; + } + + return 1; + } + catch (SDORuntimeException e) + { + if (!silent)cout << "define test failed" << endl << e << endl; + return 0; + } + +} + + +int sdotest::stocktest() +{ + return sdotest::testany("stock.wsdl",0,"stock.xml",0); +} + + +/****************************************************** +int sdotest::stocktest() +{ + int i,j; + + try { + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("stock.wsdl"); + + if ((i = xsh->getErrorCount()) > 0) + { + cout << "PROBLEM: Testany XSD reported some errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + + TypeList tl = mdg->getTypes(); + + printf("***** TYPES BEFORE RESOLVE **********************************\n"); + + for (i=0;i<tl.size();i++) + { + printf("Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + printf("Property:%s ",pl[j].getName()); + if (pl[j].isMany()) + printf("(many) "); + printf(" of type %s\n",pl[j].getType().getName()); + } + } + + printf("*******************************END TYPES******************\n"); + + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("stock.xml"); + + if ((i = xmh->getErrorCount()) > 0) + { + cout << "TestAny XML found errors:" << endl; + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + } + + + DataObjectPtr dob = doc->getRootDataObject(); + printDataObject(stdout, dob); + + return 1; + + } + catch (SDORuntimeException e) + { + if (!silent)cout << "Exception in TestAny" << e << endl; + return 0; + } +} +**************************************************/ + + +int sdotest::pete() +{ + + + int i,j; + + try { + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("pete.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + return 0; + } + + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("pete.xml"); + + if ((i = xmh->getErrorCount()) > 0) + { + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + return 0; + } + + TypeList tl = mdg->getTypes(); + + //printf("***** TYPES **********************************************\n"); + + for (i=0;i<tl.size();i++) + { + //printf("Type:%s#%s\n",tl[i].getURI(),tl[i].getName()); + PropertyList pl = tl[i].getProperties(); + for (int j=0;j<pl.size();j++) + { + //printf("Property:%s ",pl[j].getName()); + //if (pl[j].isMany()) + //printf( "(many) "); + //printf( " of type %s\n",pl[j].getType().getName()); + } + } + + //printf( "*******************************END TYPES******************\n"); + + + DataObjectPtr dob = doc->getRootDataObject(); + float f = dob->getFloat("Stock[1]/Last"); + //printf("Float is %2.3f \r\n",f); + return 1; + + } + catch (SDORuntimeException e) + { + cout << "Exception in Pete" << e << endl; + return 0; + } +} + +int sdotest::xhtml1() +{ + + + int i,j; + + try { + + + DataFactoryPtr mdg = DataFactory::getDataFactory(); + + XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg); + + xsh->defineFile("Atom1.0.xsd"); + + if ((i = xsh->getErrorCount()) > 0) + { + for (j=0;j<i;j++) + { + const char *m = xsh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + return 0; + } + + + + XMLHelperPtr xmh = HelperProvider::getXMLHelper(mdg); + + XMLDocumentPtr doc = xmh->loadFile("xhtml_in.xml"); + + if ((i = xmh->getErrorCount()) > 0) + { + for (j=0;j<i;j++) + { + const char *m = xmh->getErrorMessage(j); + if (m != 0) cout << m; + cout << endl; + } + return 0; + } + + + //DataObjectPtr dob = doc->getRootDataObject(); + + //ofstream myout("myfile"); + + //if (dob)SDOUtils::printDataObject(myout , dob); + + xmh->save(doc,"xhtml_out.xml"); + + return comparefiles("xhtml_out.xml" ,"xhtml_out.txt"); + + + } + catch (SDORuntimeException e) + { + cout << "Exception in xhtml1" << e << endl; + return 0; + } +} diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sequence.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sequence.txt new file mode 100644 index 0000000000..1a616a3d16 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/sequence.txt @@ -0,0 +1,45 @@ +====================================== +====================================== +====================================== +I am Item 1 of string +====================================== +====================================== +I am Item 1 of string +I am the first free text +====================================== +====================================== +I am Item 1 of string +I am the first free text +I am Item 2 of string +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string + +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string +department1 +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string +department1 +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string +department1 +====================================== +====================================== +I am Item 1 of string +I am free text which has been modified +I am Item 2 of string +department1 +department2 +====================================== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/setmany.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/setmany.txt new file mode 100644 index 0000000000..083ebf6b62 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/setmany.txt @@ -0,0 +1,24 @@ + School :King Norberts + Address1:The Place + Address2:1 The Avenue + Address3:Murchester + Address4:England + Class :Primary + Teacher :Mr Philbert Chloroform + Pupil1 :Witherspoon Jnr + Pupil2 :Snape + Pupil3 :Thannet + Class :Secondary + Teacher :Mr Brian Onasis + Pupil1 :Grimbling + Pupil2 :Snagget Minor + Pupil3 :Van Den Bograt +Expected path not found exception caught +Indexed as expected +Indexed as expected +Indexed as expected +Indexed as expected +Indexed as expected +Normal index out of range caught +Debatable behaviour - appended + Address4 :PostCode diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/setnull.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/setnull.txt new file mode 100644 index 0000000000..f6fe0633e1 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/setnull.txt @@ -0,0 +1,42 @@ +===== Modified Object Starts +Xpath:#/ +The modified objects type is NullNS#NullMainType +===== Old Property Values Begin +Property asub of type DataObject object still exists + +Property bsub(UNSET) of type DataObject - object null or unset + +===== Old Property Values End +=====Modified Object Ends +===== Modified Object Starts +Xpath:#/subs.0 +The modified objects type is NullNS#NullSubType +===== Old Property Values Begin +Property name of type String:All Initially set + +Property number of type Integer:100 + +Property bool of type Boolean:0 + +===== Old Property Values End +=====Modified Object Ends +===== Modified Object Starts +Xpath:#/subs.1 +The modified objects type is NullNS#NullSubType +===== Old Property Values Begin +Property bool(UNSET) of type Boolean:0 + +===== Old Property Values End +=====Modified Object Ends +===== Modified Object Starts +Xpath:#/subs.2 +The modified objects type is NullNS#NullSubType +===== Old Property Values Begin +Property name(ISNULL) of type String: + +Property number(ISNULL) of type Integer:0 + +Property bool(ISNULL) of type Boolean:0 + +===== Old Property Values End +=====Modified Object Ends diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/showdefault1.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/showdefault1.txt new file mode 100644 index 0000000000..f49e95dd58 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/showdefault1.txt @@ -0,0 +1,15 @@ +Boolean default is : 0 +Boolean default as a string is false +Byte default is : 0 +Byte default as a string is 0 +Character default is : 0 +Character default as a string is 0 +Short default is : 0 +Integer default is : 0 +Integer many default is : 0 +Long default is : 0 +Float default is : 0.000 +Double default is : 0.000 +Date default is : 0 +String default is zero length +Bytes default is zero length diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/showdefault2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/showdefault2.txt new file mode 100644 index 0000000000..a7bd1cba92 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/showdefault2.txt @@ -0,0 +1,18 @@ +Boolean default is : 1 +Boolean default as a string is true +Byte default is : 100 +Byte default as a string is 100 +Character default is : 101 +Character default as a string is 101 +Short default is : 300 +Integer default is : 400 +Integer many default is : 800 +Long default is : 500 +Float default is : 600.000 +Double default is : 700.000 +Date default is : 900 +String default length is 4 +HELP +String default as a string is HELP +Bytes default length is 4 +HELP diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.txt new file mode 100644 index 0000000000..0b143e19a9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.txt @@ -0,0 +1,8 @@ +Type:#RootType +Property:person +Type of property:String +IsMany?0 +===== DataObject contents ===== +person:string:someone + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.xml new file mode 100644 index 0000000000..4a3c7acce8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<person>someone</person> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.xsd new file mode 100644 index 0000000000..771ec558fb --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/simple.xsd @@ -0,0 +1,19 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> +<xs:element name="person" type="xs:string"/> +</xs:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock.wsdl b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock.wsdl new file mode 100644 index 0000000000..daa5342656 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock.wsdl @@ -0,0 +1,387 @@ +<?xml version="1.0" encoding="utf-8"?>
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://ws.invesbot.com/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://ws.invesbot.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+ <wsdl:types>
+ <s:schema elementFormDefault="qualified" targetNamespace="http://ws.invesbot.com/">
+ <s:element name="GetQuotes">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="symbols" type="s:string" />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetQuotesResponse">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="GetQuotesResult">
+ <s:complexType mixed="true">
+ <s:sequence>
+ <s:any />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetQuote">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="symbol" type="s:string" />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetQuoteResponse">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult">
+ <s:complexType mixed="true">
+ <s:sequence>
+ <s:any />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetMarketIndex">
+ <s:complexType />
+ </s:element>
+ <s:element name="GetMarketIndexResponse">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="GetMarketIndexResult">
+ <s:complexType mixed="true">
+ <s:sequence>
+ <s:any />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetECNQuotes">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="symbols" type="s:string" />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ <s:element name="GetECNQuotesResponse">
+ <s:complexType>
+ <s:sequence>
+ <s:element minOccurs="0" maxOccurs="1" name="GetECNQuotesResult">
+ <s:complexType mixed="true">
+ <s:sequence>
+ <s:any />
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ </s:sequence>
+ </s:complexType>
+ </s:element>
+ </s:schema>
+ </wsdl:types>
+ <wsdl:message name="GetQuotesSoapIn">
+ <wsdl:part name="parameters" element="tns:GetQuotes" />
+ </wsdl:message>
+ <wsdl:message name="GetQuotesSoapOut">
+ <wsdl:part name="parameters" element="tns:GetQuotesResponse" />
+ </wsdl:message>
+ <wsdl:message name="GetQuoteSoapIn">
+ <wsdl:part name="parameters" element="tns:GetQuote" />
+ </wsdl:message>
+ <wsdl:message name="GetQuoteSoapOut">
+ <wsdl:part name="parameters" element="tns:GetQuoteResponse" />
+ </wsdl:message>
+ <wsdl:message name="GetMarketIndexSoapIn">
+ <wsdl:part name="parameters" element="tns:GetMarketIndex" />
+ </wsdl:message>
+ <wsdl:message name="GetMarketIndexSoapOut">
+ <wsdl:part name="parameters" element="tns:GetMarketIndexResponse" />
+ </wsdl:message>
+ <wsdl:message name="GetECNQuotesSoapIn">
+ <wsdl:part name="parameters" element="tns:GetECNQuotes" />
+ </wsdl:message>
+ <wsdl:message name="GetECNQuotesSoapOut">
+ <wsdl:part name="parameters" element="tns:GetECNQuotesResponse" />
+ </wsdl:message>
+ <wsdl:message name="GetQuotesHttpGetIn">
+ <wsdl:part name="symbols" type="s:string" />
+ </wsdl:message>
+ <wsdl:message name="GetQuotesHttpGetOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetQuoteHttpGetIn">
+ <wsdl:part name="symbol" type="s:string" />
+ </wsdl:message>
+ <wsdl:message name="GetQuoteHttpGetOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetMarketIndexHttpGetIn" />
+ <wsdl:message name="GetMarketIndexHttpGetOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetECNQuotesHttpGetIn">
+ <wsdl:part name="symbols" type="s:string" />
+ </wsdl:message>
+ <wsdl:message name="GetECNQuotesHttpGetOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetQuotesHttpPostIn">
+ <wsdl:part name="symbols" type="s:string" />
+ </wsdl:message>
+ <wsdl:message name="GetQuotesHttpPostOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetQuoteHttpPostIn">
+ <wsdl:part name="symbol" type="s:string" />
+ </wsdl:message>
+ <wsdl:message name="GetQuoteHttpPostOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetMarketIndexHttpPostIn" />
+ <wsdl:message name="GetMarketIndexHttpPostOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:message name="GetECNQuotesHttpPostIn">
+ <wsdl:part name="symbols" type="s:string" />
+ </wsdl:message>
+ <wsdl:message name="GetECNQuotesHttpPostOut">
+ <wsdl:part name="Body" />
+ </wsdl:message>
+ <wsdl:portType name="StockQuotesSoap">
+ <wsdl:operation name="GetQuotes">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter symbols, seperated by space, Quotes delayed in 20 minutes.</wsdl:documentation>
+ <wsdl:input message="tns:GetQuotesSoapIn" />
+ <wsdl:output message="tns:GetQuotesSoapOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter one symbol, quote delayed in 20 minutes.</wsdl:documentation>
+ <wsdl:input message="tns:GetQuoteSoapIn" />
+ <wsdl:output message="tns:GetQuoteSoapOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Dow, Nasdaq, S&P500 index.</wsdl:documentation>
+ <wsdl:input message="tns:GetMarketIndexSoapIn" />
+ <wsdl:output message="tns:GetMarketIndexSoapOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter symbols, seperated by space, Real-Time ECN quote.</wsdl:documentation>
+ <wsdl:input message="tns:GetECNQuotesSoapIn" />
+ <wsdl:output message="tns:GetECNQuotesSoapOut" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:portType name="StockQuotesHttpGet">
+ <wsdl:operation name="GetQuotes">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter symbols, seperated by space, Quotes delayed in 20 minutes.</wsdl:documentation>
+ <wsdl:input message="tns:GetQuotesHttpGetIn" />
+ <wsdl:output message="tns:GetQuotesHttpGetOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter one symbol, quote delayed in 20 minutes.</wsdl:documentation>
+ <wsdl:input message="tns:GetQuoteHttpGetIn" />
+ <wsdl:output message="tns:GetQuoteHttpGetOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Dow, Nasdaq, S&P500 index.</wsdl:documentation>
+ <wsdl:input message="tns:GetMarketIndexHttpGetIn" />
+ <wsdl:output message="tns:GetMarketIndexHttpGetOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter symbols, seperated by space, Real-Time ECN quote.</wsdl:documentation>
+ <wsdl:input message="tns:GetECNQuotesHttpGetIn" />
+ <wsdl:output message="tns:GetECNQuotesHttpGetOut" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:portType name="StockQuotesHttpPost">
+ <wsdl:operation name="GetQuotes">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter symbols, seperated by space, Quotes delayed in 20 minutes.</wsdl:documentation>
+ <wsdl:input message="tns:GetQuotesHttpPostIn" />
+ <wsdl:output message="tns:GetQuotesHttpPostOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter one symbol, quote delayed in 20 minutes.</wsdl:documentation>
+ <wsdl:input message="tns:GetQuoteHttpPostIn" />
+ <wsdl:output message="tns:GetQuoteHttpPostOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Dow, Nasdaq, S&P500 index.</wsdl:documentation>
+ <wsdl:input message="tns:GetMarketIndexHttpPostIn" />
+ <wsdl:output message="tns:GetMarketIndexHttpPostOut" />
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Enter symbols, seperated by space, Real-Time ECN quote.</wsdl:documentation>
+ <wsdl:input message="tns:GetECNQuotesHttpPostIn" />
+ <wsdl:output message="tns:GetECNQuotesHttpPostOut" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="StockQuotesSoap" type="tns:StockQuotesSoap">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="GetQuotes">
+ <soap:operation soapAction="http://ws.invesbot.com/GetQuotes" style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <soap:operation soapAction="http://ws.invesbot.com/GetQuote" style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <soap:operation soapAction="http://ws.invesbot.com/GetMarketIndex" style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <soap:operation soapAction="http://ws.invesbot.com/GetECNQuotes" style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:binding name="StockQuotesSoap12" type="tns:StockQuotesSoap">
+ <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="GetQuotes">
+ <soap12:operation soapAction="http://ws.invesbot.com/GetQuotes" style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <soap12:operation soapAction="http://ws.invesbot.com/GetQuote" style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <soap12:operation soapAction="http://ws.invesbot.com/GetMarketIndex" style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <soap12:operation soapAction="http://ws.invesbot.com/GetECNQuotes" style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:binding name="StockQuotesHttpGet" type="tns:StockQuotesHttpGet">
+ <http:binding verb="GET" />
+ <wsdl:operation name="GetQuotes">
+ <http:operation location="/GetQuotes" />
+ <wsdl:input>
+ <http:urlEncoded />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <http:operation location="/GetQuote" />
+ <wsdl:input>
+ <http:urlEncoded />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <http:operation location="/GetMarketIndex" />
+ <wsdl:input>
+ <http:urlEncoded />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <http:operation location="/GetECNQuotes" />
+ <wsdl:input>
+ <http:urlEncoded />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:binding name="StockQuotesHttpPost" type="tns:StockQuotesHttpPost">
+ <http:binding verb="POST" />
+ <wsdl:operation name="GetQuotes">
+ <http:operation location="/GetQuotes" />
+ <wsdl:input>
+ <mime:content type="application/x-www-form-urlencoded" />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetQuote">
+ <http:operation location="/GetQuote" />
+ <wsdl:input>
+ <mime:content type="application/x-www-form-urlencoded" />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetMarketIndex">
+ <http:operation location="/GetMarketIndex" />
+ <wsdl:input>
+ <mime:content type="application/x-www-form-urlencoded" />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="GetECNQuotes">
+ <http:operation location="/GetECNQuotes" />
+ <wsdl:input>
+ <mime:content type="application/x-www-form-urlencoded" />
+ </wsdl:input>
+ <wsdl:output>
+ <mime:content part="Body" type="text/xml" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="StockQuotes">
+ <wsdl:port name="StockQuotesSoap" binding="tns:StockQuotesSoap">
+ <soap:address location="http://ws.invesbot.com/stockquotes.asmx" />
+ </wsdl:port>
+ <wsdl:port name="StockQuotesSoap12" binding="tns:StockQuotesSoap12">
+ <soap12:address location="http://ws.invesbot.com/stockquotes.asmx" />
+ </wsdl:port>
+ <wsdl:port name="StockQuotesHttpGet" binding="tns:StockQuotesHttpGet">
+ <http:address location="http://ws.invesbot.com/stockquotes.asmx" />
+ </wsdl:port>
+ <wsdl:port name="StockQuotesHttpPost" binding="tns:StockQuotesHttpPost">
+ <http:address location="http://ws.invesbot.com/stockquotes.asmx" />
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock.xml new file mode 100644 index 0000000000..28061c84b8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock.xml @@ -0,0 +1,41 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<GetQuotesResponse xmlns="http://ws.invesbot.com/"> +<GetQuotesResult> +<StockQuotes> +<StockQuote> +<Symbol>IBM</Symbol> +<Price><big><b>82.72</b></big></Price> +<Time>11:41AM ET</Time> +<Change><img width="10" height="14" border="0" src="http://us.i1.yimg.com/us.yimg.com/i/us/fi/03rd/down_r.gif" alt="Down">&nbsp;<b style="color:#cc0000;">0.17 (0.21%)</b></Change> +<PrevClose>82.89</PrevClose> +<Open>82.49</Open> +<Bid>N/A</Bid> +<Ask>N/A</Ask> +<YearTarget>95.94</YearTarget> +<DayRange>82.40 - 82.80</DayRange> +<YearRange>72.50 - 89.94</YearRange> +<Volume>1,568,200</Volume> +<AvgVol>5,301,380</AvgVol> +<MarketCap>128.25B</MarketCap> +<PE>16.15</PE> +<EPS>5.12</EPS> +<DivYield>1.20 (1.40%)</DivYield> +</StockQuote> +</StockQuotes> +</GetQuotesResult> +</GetQuotesResponse> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock_wsdl.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock_wsdl.txt new file mode 100644 index 0000000000..47a11b4d3b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock_wsdl.txt @@ -0,0 +1,47 @@ +***** TYPES BEFORE RESOLVE ********************************** +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://ws.invesbot.com/#GetECNQuotes +Property:symbols of type String +Type:http://ws.invesbot.com/#GetECNQuotesResponse +Property:GetECNQuotesResult of type GetECNQuotesResult +Type:http://ws.invesbot.com/#GetECNQuotesResult +Type:http://ws.invesbot.com/#GetMarketIndex +Type:http://ws.invesbot.com/#GetMarketIndexResponse +Property:GetMarketIndexResult of type GetMarketIndexResult +Type:http://ws.invesbot.com/#GetMarketIndexResult +Type:http://ws.invesbot.com/#GetQuote +Property:symbol of type String +Type:http://ws.invesbot.com/#GetQuoteResponse +Property:GetQuoteResult of type GetQuoteResult +Type:http://ws.invesbot.com/#GetQuoteResult +Type:http://ws.invesbot.com/#GetQuotes +Property:symbols of type String +Type:http://ws.invesbot.com/#GetQuotesResponse +Property:GetQuotesResult of type GetQuotesResult +Type:http://ws.invesbot.com/#GetQuotesResult +Type:http://ws.invesbot.com/#RootType +Property:GetQuotes of type GetQuotes +Property:GetQuotesResponse of type GetQuotesResponse +Property:GetQuote of type GetQuote +Property:GetQuoteResponse of type GetQuoteResponse +Property:GetMarketIndex of type GetMarketIndex +Property:GetMarketIndexResponse of type GetMarketIndexResponse +Property:GetECNQuotes of type GetECNQuotes +Property:GetECNQuotesResponse of type GetECNQuotesResponse +*******************************END TYPES****************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock_xml.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock_xml.txt new file mode 100644 index 0000000000..6aa493dfa3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/stock_xml.txt @@ -0,0 +1,127 @@ +***** TYPES AFTER RESOLVE********************************* +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#OpenDataObject +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://ws.invesbot.com/#GetECNQuotes +Property:symbols of type String +Type:http://ws.invesbot.com/#GetECNQuotesResponse +Property:GetECNQuotesResult of type GetECNQuotesResult +Type:http://ws.invesbot.com/#GetECNQuotesResult +Type:http://ws.invesbot.com/#GetMarketIndex +Type:http://ws.invesbot.com/#GetMarketIndexResponse +Property:GetMarketIndexResult of type GetMarketIndexResult +Type:http://ws.invesbot.com/#GetMarketIndexResult +Type:http://ws.invesbot.com/#GetQuote +Property:symbol of type String +Type:http://ws.invesbot.com/#GetQuoteResponse +Property:GetQuoteResult of type GetQuoteResult +Type:http://ws.invesbot.com/#GetQuoteResult +Type:http://ws.invesbot.com/#GetQuotes +Property:symbols of type String +Type:http://ws.invesbot.com/#GetQuotesResponse +Property:GetQuotesResult of type GetQuotesResult +Type:http://ws.invesbot.com/#GetQuotesResult +Type:http://ws.invesbot.com/#RootType +Property:GetQuotes of type GetQuotes +Property:GetQuotesResponse of type GetQuotesResponse +Property:GetQuote of type GetQuote +Property:GetQuoteResponse of type GetQuoteResponse +Property:GetMarketIndex of type GetMarketIndex +Property:GetMarketIndexResponse of type GetMarketIndexResponse +Property:GetECNQuotes of type GetECNQuotes +Property:GetECNQuotesResponse of type GetECNQuotesResponse +*******************************END TYPES****************** +===== DataObject contents ===== +GetQuotesResult:dataObject +===== Sequenced DataObject contents ===== +Setting of DO property StockQuotes[0]= +===== Sequenced DataObject contents ===== +Setting of DO property StockQuote[0]= +===== Sequenced DataObject contents ===== +Setting of DO property Symbol[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:IBM +===== End Sequenced DataObject contents = +Setting of DO property Price[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:<big><b>82.72</b></big> +===== End Sequenced DataObject contents = +Setting of DO property Time[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:11:41AM ET +===== End Sequenced DataObject contents = +Setting of DO property Change[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:<img width="10" height="14" border="0" src="http://us.i1.yimg.com/us.yimg.com/i/us/fi/03rd/down_r.gif" alt="Down"> <b style="color:#cc0000;">0.17 (0.21%)</b> +===== End Sequenced DataObject contents = +Setting of DO property PrevClose[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:82.89 +===== End Sequenced DataObject contents = +Setting of DO property Open[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:82.49 +===== End Sequenced DataObject contents = +Setting of DO property Bid[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:N/A +===== End Sequenced DataObject contents = +Setting of DO property Ask[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:N/A +===== End Sequenced DataObject contents = +Setting of DO property YearTarget[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:95.94 +===== End Sequenced DataObject contents = +Setting of DO property DayRange[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:82.40 - 82.80 +===== End Sequenced DataObject contents = +Setting of DO property YearRange[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:72.50 - 89.94 +===== End Sequenced DataObject contents = +Setting of DO property Volume[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:1,568,200 +===== End Sequenced DataObject contents = +Setting of DO property AvgVol[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:5,301,380 +===== End Sequenced DataObject contents = +Setting of DO property MarketCap[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:128.25B +===== End Sequenced DataObject contents = +Setting of DO property PE[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:16.15 +===== End Sequenced DataObject contents = +Setting of DO property EPS[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:5.12 +===== End Sequenced DataObject contents = +Setting of DO property DivYield[0]= +===== Sequenced DataObject contents ===== +TEXT ELEMENT:1.20 (1.40%) +===== End Sequenced DataObject contents = +===== End Sequenced DataObject contents = +===== End Sequenced DataObject contents = +===== End Sequenced DataObject contents = + +===== End DataObject ===== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/include3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/include3.xsd new file mode 100644 index 0000000000..b6ec93f0ba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/include3.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother.xsd new file mode 100644 index 0000000000..fd0b9a61f4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:include schemaLocation = "includeother1.xsd"/> + <xsd:include schemaLocation = "./includeother2.xsd"/> + <xsd:include schemaLocation = "../Debug/includeother3.xsd"/> + + + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother1.xsd new file mode 100644 index 0000000000..9cbc5d9d27 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother1.xsd @@ -0,0 +1,34 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother2.xsd new file mode 100644 index 0000000000..329fd17761 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/t2/includeother2.xsd @@ -0,0 +1,33 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/include3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/include3.xsd new file mode 100644 index 0000000000..b6ec93f0ba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/include3.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother.xsd new file mode 100644 index 0000000000..5ecbdab1ca --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:include schemaLocation = "includeother1.xsd"/> + <xsd:include schemaLocation = "./includeother2.xsd"/> + <xsd:include schemaLocation = "../test2/includeother3.xsd"/> + + + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother1.xsd new file mode 100644 index 0000000000..9cbc5d9d27 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother1.xsd @@ -0,0 +1,34 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:element name="company" type="company:CompanyType"/> + <xsd:complexType name="CompanyType"> + <xsd:sequence> + <xsd:element name="departments" type="company:DepartmentType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="cs" type="sdo:ChangeSummaryType"/> + <xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF" sdoxml:propertyType="company:EmployeeType"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother2.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother2.xsd new file mode 100644 index 0000000000..329fd17761 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test/includeother2.xsd @@ -0,0 +1,33 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="DepartmentType"> + <xsd:sequence> + <xsd:element name="employees" type="company:EmployeeType" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="location" type="xsd:string"/> + <xsd:attribute name="number" type="xsd:int"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test2/includeother3.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test2/includeother3.xsd new file mode 100644 index 0000000000..b6ec93f0ba --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/test2/includeother3.xsd @@ -0,0 +1,30 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + <xsd:schema + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:sdo="commonj.sdo" + xmlns:sdoxml="commonj.sdo/xml" + xmlns:company="companyNS" + targetNamespace="companyNS"> + + <xsd:complexType name="EmployeeType"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="SN" type="xsd:ID"/> + <xsd:attribute name="manager" type="xsd:boolean"/> + </xsd:complexType> + </xsd:schema> + diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testabstract.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testabstract.txt new file mode 100644 index 0000000000..80c1d03afe --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testabstract.txt @@ -0,0 +1,5 @@ +Normal unsupportedoperation for creation of abstract type +Publication is of type BookType +Publication is of type MagazineType +Book is of type BookType +Magazine is of type MagazineType diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testerrors.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testerrors.txt new file mode 100644 index 0000000000..6cfce57b31 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testerrors.txt @@ -0,0 +1,7 @@ +XSD reported some errors: +Opening and ending tag mismatch: complexType line 40 and schema + +Premature end of data in tag schema line 18 + +XML reported some errors: +Parser found unknown element company diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testinc2.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testinc2.txt new file mode 100644 index 0000000000..837559562e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testinc2.txt @@ -0,0 +1,21 @@ +Type:commonj.sdo#BigDecimal +Type:commonj.sdo#BigInteger +Type:commonj.sdo#Boolean +Type:commonj.sdo#Byte +Type:commonj.sdo#Bytes +Type:commonj.sdo#ChangeSummary +Type:commonj.sdo#Character +Type:commonj.sdo#DataObject +Type:commonj.sdo#Date +Type:commonj.sdo#Double +Type:commonj.sdo#Float +Type:commonj.sdo#Integer +Type:commonj.sdo#Long +Type:commonj.sdo#Short +Type:commonj.sdo#String +Type:commonj.sdo#URI +Type:http://example.org/Calculator#RootType +Type:http://example.org/CalculatorTypes#AddArguments +Property:a +Property:b +Type:http://example.org/CalculatorTypes#RootType diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testopen.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testopen.txt new file mode 100644 index 0000000000..7d7b816e6d --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testopen.txt @@ -0,0 +1,24 @@ +Normal exception for setting null on undefined prop +Open Type string value: Value Of Open String +Open Type boolean value: 1 +EMP1 type property: name ( many? 0) of type String +EMP1 type property: SN ( many? 0) of type String +EMP1 type property: manager ( many? 0) of type Boolean +EMP1 inst property: name (many? 0) of type String +EMP1 inst property: SN (many? 0) of type String +EMP1 inst property: manager (many? 0) of type Boolean +EMP1 inst property: openstring (many? 0) of type Bytes +EMP1 inst property: openboolean (many? 0) of type Boolean +EMP1 inst property: opentypelist (many? 1) of type Short +EMP1 inst property: name (many? 0) of type String +EMP1 inst property: SN (many? 0) of type String +EMP1 inst property: manager (many? 0) of type Boolean +EMP1 inst property: openboolean (many? 0) of type Boolean +EMP1 inst property: opentypelist (many? 1) of type Short +EMP1 inst property: name (many? 0) of type String +EMP1 inst property: SN (many? 0) of type String +EMP1 inst property: manager (many? 0) of type Boolean +EMP1 inst property: opentypelist (many? 1) of type Short +EMP1 inst property: name (many? 0) of type String +EMP1 inst property: SN (many? 0) of type String +EMP1 inst property: manager (many? 0) of type Boolean diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testopen3.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testopen3.xml new file mode 100644 index 0000000000..57dfb96ec4 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testopen3.xml @@ -0,0 +1,17 @@ + +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:tns="companyNS" targetNamespace="companyNS"><xsd:element name="companyType" type="tns:CompanyType"/><xsd:complexType name="CompanyType" sdo:aliasName="TheFirm TheBigFirm"><xsd:sequence><xsd:element name="departments" type="tns:DepartmentType" minOccurs="0" maxOccurs="unbounded" sdo:aliasName="TheDepartments MYDepartments"/></xsd:sequence><xsd:element name="changeSummary" type="sdo:ChangeSummaryType"/><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="employeeOfTheMonth" sdoxml:propertyType="tns:EmployeeType" type="xsd:anyURI"/></xsd:complexType><xsd:element name="departmentType" type="tns:DepartmentType"/><xsd:complexType name="DepartmentType"><xsd:sequence><xsd:element name="employees" type="tns:EmployeeType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="location" type="xsd:String"/><xsd:attribute name="number" type="xsd:String"/></xsd:complexType><xsd:element name="employeeType" type="tns:EmployeeType"/><xsd:complexType name="EmployeeType"><xsd:attribute name="name" type="xsd:String"/><xsd:attribute name="SN" type="xsd:String"/><xsd:attribute name="manager" type="xsd:boolean"/><xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/><xsd:anyAttribute namespace="##any" processContents="lax"/></xsd:complexType><xsd:element name="openType" type="tns:OpenType"/><xsd:complexType name="OpenType"><xsd:attribute name="name" type="xsd:String"/></xsd:complexType><xsd:attribute name="openboolean" type="xsd:boolean"/><xsd:element name="opendataobject" type="tns:OpenType" minOccurs="0"/><xsd:element name="opendataobjectlist" type="tns:OpenType" minOccurs="0" maxOccurs="unbounded"/><xsd:element name="openintlist" type="xsd:short" minOccurs="0" maxOccurs="unbounded"/><xsd:attribute name="openstring" type="xsd:hexBinary"/></xsd:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testorder.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testorder.txt new file mode 100644 index 0000000000..4f46cbfecf --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testorder.txt @@ -0,0 +1,19 @@ +Type:#Address +Property:name +Property:street +Property:city +Type:#RootType +Property:employee +Type:#UKAddress +Property:value +Property:postcode +Type:#USAddress +Property:value +Property:zip +Type:#fullpersoninfo +Property:address +Property:city +Property:country +Type:#personinfo +Property:firstname +Property:lastname diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/teststyles.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/teststyles.txt new file mode 100644 index 0000000000..52de3ffc6a --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/teststyles.txt @@ -0,0 +1,93 @@ +*****STYLE Style1.xsd +Type: commonj.sdo#BigDecimal +Type: commonj.sdo#BigInteger +Type: commonj.sdo#Boolean +Type: commonj.sdo#Byte +Type: commonj.sdo#Bytes +Type: commonj.sdo#ChangeSummary +Type: commonj.sdo#Character +Type: commonj.sdo#DataObject +Type: commonj.sdo#Date +Type: commonj.sdo#Double +Type: commonj.sdo#Float +Type: commonj.sdo#Integer +Type: commonj.sdo#Long +Type: commonj.sdo#OpenDataObject +Type: commonj.sdo#Short +Type: commonj.sdo#String +Type: commonj.sdo#URI +Type: libraryNS#RootType +Type: libraryNS#author +Type: libraryNS#available +Type: libraryNS#book +Type: libraryNS#character +Type: libraryNS#isbn +Type: libraryNS#library +Property:book +Type: libraryNS#title +************* +Root is:libraryNS#character +Root is:libraryNS#library +Root is:libraryNS#library +*****STYLE Style2.xsd +Type: commonj.sdo#BigDecimal +Type: commonj.sdo#BigInteger +Type: commonj.sdo#Boolean +Type: commonj.sdo#Byte +Type: commonj.sdo#Bytes +Type: commonj.sdo#ChangeSummary +Type: commonj.sdo#Character +Type: commonj.sdo#DataObject +Type: commonj.sdo#Date +Type: commonj.sdo#Double +Type: commonj.sdo#Float +Type: commonj.sdo#Integer +Type: commonj.sdo#Long +Type: commonj.sdo#OpenDataObject +Type: commonj.sdo#Short +Type: commonj.sdo#String +Type: commonj.sdo#URI +Type: libraryNS#RootType +Type: libraryNS#author +Type: libraryNS#available +Type: libraryNS#book +Type: libraryNS#character +Type: libraryNS#isbn +Type: libraryNS#library +Property:book +Type: libraryNS#title +************* +Root is:libraryNS#character +Root is:libraryNS#library +Root is:libraryNS#library +*****STYLE Style3.xsd +Type: commonj.sdo#BigDecimal +Type: commonj.sdo#BigInteger +Type: commonj.sdo#Boolean +Type: commonj.sdo#Byte +Type: commonj.sdo#Bytes +Type: commonj.sdo#ChangeSummary +Type: commonj.sdo#Character +Type: commonj.sdo#DataObject +Type: commonj.sdo#Date +Type: commonj.sdo#Double +Type: commonj.sdo#Float +Type: commonj.sdo#Integer +Type: commonj.sdo#Long +Type: commonj.sdo#OpenDataObject +Type: commonj.sdo#Short +Type: commonj.sdo#String +Type: commonj.sdo#URI +Type: libraryNS#RootType +Type: libraryNS#author +Type: libraryNS#available +Type: libraryNS#bookType +Type: libraryNS#character +Type: libraryNS#isbn +Type: libraryNS#library +Property:book +Type: libraryNS#title +************* +Root is:libraryNS#character +Root is:libraryNS#library +Root is:libraryNS#library diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testsubsload.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testsubsload.txt new file mode 100644 index 0000000000..43c16114c3 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testsubsload.txt @@ -0,0 +1,7 @@ +TEST: TestSubsLoad ========================================== +Publication is of type PublicationType +Publication is of type BookType +Publication is of type MagazineType +Book is of type BookType +Magazine is of type MagazineType +END TEST: TestSubsLoad ====================================== diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testutils.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testutils.txt new file mode 100644 index 0000000000..dd86813b90 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testutils.txt @@ -0,0 +1,100 @@ +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO +DataObject type: companyNS#CompanyType + Property: name + Property Type: commonj.sdo#String + Property Value: ACME + Property: employeeOfTheMonth + Property Type: companyNS#EmployeeType + Property Value: not set + Property: departments + Property Type: companyNS#DepartmentType + Value 0 +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: companyNS#DepartmentType + Property: name + Property Type: commonj.sdo#String + Property Value: Advanced Technologies + Property: location + Property Type: commonj.sdo#String + Property Value: NY + Property: number + Property Type: commonj.sdo#String + Property Value: 123 + Property: employees + Property Type: companyNS#EmployeeType + Value 0 +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: companyNS#EmployeeType + Property: name + Property Type: commonj.sdo#String + Property Value: Albert + Property: SN + Property Type: commonj.sdo#String + Property Value: E0001 + Property: manager + Property Type: commonj.sdo#Boolean + Property Value: not set + Property: openstring + Property Type: commonj.sdo#Bytes + Property Value: Value Of Open String + Property: openboolean + Property Type: commonj.sdo#Boolean + Property Value: true + Property: openintlist + Property Type: commonj.sdo#Short + Value 0 +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: commonj.sdo#Short +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do + + Property: opendataobjectlist + Property Type: companyNS#OpenType + Value 0 +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: companyNS#OpenType + Property: name + Property Type: commonj.sdo#String + Property Value: MyOpenName +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do + + Property: opendataobject + Property Type: companyNS#OpenType +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: companyNS#OpenType + Property: name + Property Type: commonj.sdo#String + Property Value: MyOpenName +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do + + Value 1 +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: companyNS#EmployeeType + Property: name + Property Type: commonj.sdo#String + Property Value: Boris + Property: SN + Property Type: commonj.sdo#String + Property Value: E0002 + Property: manager + Property Type: commonj.sdo#Boolean + Property Value: true +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do + + Value 2 +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start of DO + DataObject type: companyNS#EmployeeType + Property: name + Property Type: commonj.sdo#String + Property Value: Carl + Property: SN + Property Type: commonj.sdo#String + Property Value: E0003 + Property: manager + Property Type: commonj.sdo#Boolean + Property Value: not set +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do + +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do + +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of do diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testwsdl.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testwsdl.txt new file mode 100644 index 0000000000..025b797d96 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testwsdl.txt @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xsi:type="tDefinitions" xmlns:tns2="http://I want/this/added/to/the/urls" xmlns:tns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><message name="testRequest"><part name="name" type="xsi:string"/><part name="name" type="tns2:string"/></message></definitions> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testwsdl.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testwsdl.xml new file mode 100644 index 0000000000..5fe93371ca --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/testwsdl.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xsi:type="tDefinitions" xmlns:tns2="http://I want/this/added/to/the/urls" xmlns:tns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><message name="testRequest"><part name="name" type="xsi:string"/><part name="name" type="tns2:string"/></message></definitions> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/travel.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/travel.txt new file mode 100644 index 0000000000..5311a919f8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/travel.txt @@ -0,0 +1,146 @@ +*******************************TYPES********************** +TYPE:#Client +TYPE:#Excursion +TYPE:#Flight +TYPE:#Holiday +TYPE:#Hotel +TYPE:#Party +TYPE:#Person +TYPE:#Room +TYPE:#RootType +TYPE:commonj.sdo#BigDecimal +TYPE:commonj.sdo#BigInteger +TYPE:commonj.sdo#Boolean +TYPE:commonj.sdo#Byte +TYPE:commonj.sdo#Bytes +TYPE:commonj.sdo#ChangeSummary +TYPE:commonj.sdo#Character +TYPE:commonj.sdo#DataObject +TYPE:commonj.sdo#Date +TYPE:commonj.sdo#Double +TYPE:commonj.sdo#Float +TYPE:commonj.sdo#Integer +TYPE:commonj.sdo#Long +TYPE:commonj.sdo#OpenDataObject +TYPE:commonj.sdo#Short +TYPE:commonj.sdo#String +TYPE:commonj.sdo#URI +*******************************END TYPES****************** +*******************************DATA********************** +===== DataObject contents ===== +Flight: list dataObject[0]= +===== DataObject contents ===== +Departure:string:LHR + +Arrival:string:SNG + +flightNo:string:BA243 + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +Departure:string:SNG + +Arrival:string:LHR + +flightNo:string:SG561 + +===== End DataObject ===== + +Hotel: list dataObject[0]= +===== DataObject contents ===== +Name:string:Excelsior + +Phone:string:222-3333 + +Room:dataObject +===== DataObject contents ===== +value:string:303 + +booked:boolean:1 + +===== End DataObject ===== + +cardsAccepted:boolean:1 + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +Name:string:Seedy Lodge + +Phone:string:888-9999 + +Room:dataObject +===== DataObject contents ===== +value:string:14 + +booked:boolean:1 + +===== End DataObject ===== + +cardsAccepted:boolean:0 + +===== End DataObject ===== + +dataObject[2]= +===== DataObject contents ===== +Name:string:Hilton + +Phone:string:444-5555 + +Room:dataObject +===== DataObject contents ===== +value:string:456 + +booked:boolean:0 + +===== End DataObject ===== + +cardsAccepted:boolean:1 + +===== End DataObject ===== + +Excursion:dataObject +===== DataObject contents ===== +Title:string:Bird Baths of Singapore + +Cost:string:50 + +===== End DataObject ===== + +Client:dataObject +===== DataObject contents ===== +Name:string:Steve + +Address:string:134 Shirley Road + +CreditCard:string:1234-8908-6543-900 + +===== End DataObject ===== + +Party:dataObject +===== DataObject contents ===== +Person: list dataObject[0]= +===== DataObject contents ===== +Name:string:John + +===== End DataObject ===== + +dataObject[1]= +===== DataObject contents ===== +Name:string:Jane + +===== End DataObject ===== + +dataObject[2]= +===== DataObject contents ===== +Name:string:Bill + +===== End DataObject ===== + +===== End DataObject ===== + +===== End DataObject ===== +***************************END DATA********************** diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/userdata.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/userdata.txt new file mode 100644 index 0000000000..e24caba194 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/userdata.txt @@ -0,0 +1,10 @@ +Expected 0xF1F1F1F1 F1F1F1F1 +Expected 0xF1F1F1F1 F1F1F1F1 +Expected 0x20 00000020 +Expected 0x40020 00040020 +Expected 0 00000000 +Expected 0 00000000 +Expected 120 00000120 +Expected 0 00000000 +Expected 640 00000640 +Expected 0x740 00000740 diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/utils.cpp b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/utils.cpp new file mode 100644 index 0000000000..4b13998c6b --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/utils.cpp @@ -0,0 +1,551 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Id: utils.cpp,v 1.1 2006/03/16 10:54:16 slattery Exp $ */ + +#include <stdio.h> + +#pragma warning(disable:4786) + +#include <iostream> +using namespace std; + +#include "sdotest.h" + +bool sdotest::silent = true; +bool sdotest::ramping = false; + +void sdotest::printOldValues(FILE *f, ChangeSummaryPtr cs, DataObjectPtr dol) +{ + fprintf(f,"===== Old Property Values Begin\n"); + SettingList& sl = cs->getOldValues(dol); + if (sl.size() == 0) + { + fprintf(f,"No Settings found\n"); + } + else + { + for (int j=0;j< sl.size(); j++) + { + fprintf(f,"Property %s",sl[j].getProperty().getName()); + // this could be a many-valued property, and could be one which is + // a data object or a data type... + if (sl[j].getProperty().isMany()) + { + fprintf(f,"[%d]",sl[j].getIndex()); + } + if (!sl[j].isSet()) + { + fprintf(f,"(UNSET)"); + } + if (sl[j].isNull()) + { + fprintf(f,"(ISNULL)"); + } + + fprintf(f," of type "); + switch (sl[j].getProperty().getTypeEnum()) + { + case Type::BooleanType: + fprintf(f,"Boolean:%d\n",sl[j].getBooleanValue()); + break; + case Type::ByteType: + fprintf(f,"Byte:%d\n",sl[j].getByteValue()); + break; + case Type::CharacterType: + fprintf(f,"Character:%d\n",sl[j].getCharacterValue()); + break; + case Type::IntegerType: + fprintf(f,"Integer:%d\n",sl[j].getIntegerValue()); + break; + case Type::ShortType: + fprintf(f,"Short:%d\n",sl[j].getShortValue()); + break; + case Type::DoubleType: + fprintf(f,"Double:%.3f\n",(float)sl[j].getDoubleValue()); + break; + case Type::FloatType: + fprintf(f,"Float:%.3f\n",sl[j].getFloatValue()); + break; + case Type::LongType: + fprintf(f,"Long:%ld\n",sl[j].getIntegerValue()); + break; + case Type::DateType: + fprintf(f,"Date:%d\n",sl[j].getDateValue().getTime()); + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + fprintf(f,"String:%s\n",sl[j].getCStringValue()); + break; + case Type::BytesType: + fprintf(f,"Bytes:%s\n",sl[j].getCStringValue()); + break; + case Type::OtherTypes: + case Type::DataObjectType: + case Type::ChangeSummaryType: + { + fprintf(f,"DataObject "); + DataObjectPtr dob = sl[j].getDataObjectValue(); + if (!dob) + { + fprintf(f," - object null or unset\n"); + } + else + { + DataObjectPtr mydo = sl[j].getDataObjectValue(); + if (cs->isDeleted(mydo)) + { + fprintf(f," - object deleted \n"); + printOldValues(f, cs,mydo); + } + else + { + fprintf(f," object still exists \n"); + } + } + } + break; + default: + { + fprintf(f,"Unknown object type\n"); + } + break; + } + fprintf(f,"\n"); + } + } + fprintf(f,"===== Old Property Values End \n"); + return; +} + + +void sdotest::printDataStructure(FILE *f , DataFactory* dd) +{ + TypeList tt = dd->getTypes(); + fprintf(f,"Printing Types\n"); + for (int i = 0; i < tt.size(); ++i) + { + fprintf(f,"Type %s\n",tt[i].getName()); + PropertyList pl = tt[i].getProperties(); + for (int j = 0; j < pl.size() ; j++) + { + fprintf(f,"Has Property %s of type %s\n", + pl[j].getName(),pl[j].getType().getName()); + } + } +} + + +void sdotest::printValue(FILE *f, DataObjectPtr dp, const Property& p) +{ + switch (p.getTypeEnum()) + { + case Type::BooleanType: + fprintf(f,"boolean:%d\n",dp->getBoolean(p)); + break; + case Type::ByteType: + fprintf(f,"Byte:%d\n",dp->getByte(p)); + break; + case Type::CharacterType: + fprintf(f,"character:%d\n",dp->getCharacter(p)); + break; + case Type::IntegerType: + fprintf(f,"integer:%d\n",dp->getInteger(p)); + break; + case Type::ShortType: + fprintf(f,"short:%d\n",dp->getShort(p)); + break; + case Type::DoubleType: + fprintf(f,"double:%.3f\n",(float)dp->getDouble(p)); + break; + case Type::FloatType: + fprintf(f,"float:%.3f\n", dp->getFloat(p)); + break; + case Type::LongType: + fprintf(f,"long:%ld\n",dp->getInteger(p)); + break; + case Type::DateType: + fprintf(f,"date:%d\n",dp->getDate(p).getTime()); + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + fprintf(f,"string:%s\n", dp->getCString(p)); + break; + case Type::BytesType: + fprintf(f,"bytes:%s\n",dp->getCString(p)); + break; + case Type::OpenDataObjectType: + case Type::DataObjectType: + { + fprintf(f,"dataObject\n" ); + DataObjectPtr dob = dp->getDataObject(p); + if (!dob) + { + fprintf(f," - null or unset\n"); + } + else + { + printDataObject(f, dob); + } + } + break; + case Type::OtherTypes: + case Type::ChangeSummaryType: + default: + { + fprintf(f,"Unknown object type"); + } + break; + } + fprintf(f,"\n"); +} + +void sdotest::printList(FILE *f, DataObjectPtr dp, const Property& p) +{ + DataObjectList& dobl = dp->getList(p); + fprintf(f," list "); + + if (dobl.size() ==0) { + fprintf(f,"(empty)\n"); + return; + } + + for (int i=0;i<dobl.size();i++) { + + switch (p.getTypeEnum()) + { + case Type::BooleanType: + fprintf(f,"boolean[%d]=%d\n",i,dobl.getBoolean(i)); + break; + case Type::ByteType: + fprintf(f,"byte[%d]=%d\n",i,dobl.getByte(i)); + break; + case Type::CharacterType: + fprintf(f,"character[%d]=%d\n",i,dobl.getCharacter(i)); + break; + case Type::IntegerType: + fprintf(f,"integer[%d]=%d\n",i,dobl.getInteger(i)); + break; + case Type::ShortType: + fprintf(f,"short[%d]=%d",i, dobl.getShort(i)); + break; + case Type::DoubleType: + fprintf(f,"double[%d]=%.3f\n",i,(float)dobl.getDouble(i)); + break; + case Type::FloatType: + fprintf(f,"float[%d]=%.3f\n",i,dobl.getFloat(i)); + break; + case Type::LongType: + fprintf(f,"long[%d]=%ld\n",i,dobl.getInteger(i)); + break; + case Type::DateType: + fprintf(f,"date[%d]=%d\n",i,dobl.getDate(i).getTime()); + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::StringType: + case Type::UriType: + fprintf(f,"string[%d]=%s\n",i,dobl.getCString(i)); + break; + case Type::BytesType: + fprintf(f,"bytes[%d]=%s\n",i,dobl.getCString(i)); + break; + case Type::OpenDataObjectType: + case Type::DataObjectType: + { + fprintf(f,"dataObject[%d]=\n",i); + DataObjectPtr dob = dobl[i]; + if (!dob) + { + fprintf(f," null or unset\n"); + } + else + { + printDataObject(f, dob); + } + } + break; + case Type::OtherTypes: + case Type::ChangeSummaryType: + default: + { + fprintf(f,"Unknown object type\n");; + } + break; + } + fprintf(f,"\n"); + } +} + +void sdotest::printDataObject(FILE *f, DataObjectPtr dol) +{ + if (dol == 0) return; + + if (dol->getType().isSequencedType()) + { + fprintf(f,"===== Sequenced DataObject contents =====\n"); + SequencePtr sq = dol->getSequence(); + if (sq != 0) + { + for (unsigned int k=0;k<sq->size();k++) + { + if (sq->isText(k)) + { + fprintf(f,"TEXT ELEMENT:%s\n",sq->getCStringValue(k)); + } + else + { + const Property& p = sq->getProperty(k); + if (p.isMany()) + { + unsigned int index = sq->getListIndex(k); + DataObjectList& dl = dol->getList(p); + if (p.getType().isDataType()) + { + fprintf(f,"Setting of property %s[%d]=%s\n", + p.getName(),index,dl.getCString(index)); + } + else + { + fprintf(f,"Setting of DO property %s[%d]=\n", + p.getName(),index); + printDataObject(f,dl.getDataObject(index)); + } + } + else + { + if (p.getType().isDataType()) + { + fprintf(f,"Setting of property %s=%s\n", + p.getName(),dol->getCString(p)); + } + else + { + fprintf(f,"Setting of DO property %s=\n", + p.getName()); + printDataObject(f,dol->getDataObject(p)); + } + } + } + } + } + fprintf(f,"===== End Sequenced DataObject contents =\n"); + } + else + { + fprintf(f,"===== DataObject contents =====\n"); + PropertyList pl = dol->getInstanceProperties(); + + for (int j=0;j< pl.size(); j++) + { + fprintf(f,"%s:",pl[j].getName()); + // this could be a many-valued property, and could be one which is + // a data object or a data type... + if (pl[j].isMany()) + { + printList(f, dol,pl[j]); + } + else { + printValue(f, dol,pl[j]); + } + } + fprintf(f,"===== End DataObject =====\n"); + } +} + + + +void sdotest::dumpchangesummary(FILE *f, ChangeSummaryPtr cs) +{ + + ChangedDataObjectList& cdol = cs->getChangedDataObjects(); + + // the changed data object list contains only the objects whose properties have + // been changed. + // a changed and subsequently deleted object will not appear, but necessarily its + // container will appear, so we can rebuild it. + + for (int i=0;i< cdol.size();i++) + { + if (cs->isCreated(cdol[i])) + { + fprintf(f,"Created object in changed list\n"); + // So its in the created list, it must exist in the tree... + fprintf(f,"The object is %s#%s\n", + cdol[i]->getType().getURI(), + cdol[i]->getType().getName()); + } + if (cs->isModified(cdol[i])) + { + fprintf(f,"===== Modified Object Starts\n"); + // get to a DAS data object... + DataObject* temp = cdol[i]; + fprintf(f,"Xpath:%s\n",((DataObject*)temp)->objectToXPath()); + + if (cs->isDeleted(cdol[i])) + { + fprintf(f,"PROBLEM: DELETED OBJECT IN CHANGED LIST: \n"); + // As the item is in the deleted list - its still present.. + fprintf(f,"The type is %s#%s\n", + cdol[i]->getType().getURI(), + cdol[i]->getType().getName()); + } + else { + fprintf(f,"The modified objects type is %s#%s\n", + cdol[i]->getType().getURI(), + cdol[i]->getType().getName()); + + printOldValues(f, cs, cdol[i]); + } + fprintf(f,"=====Modified Object Ends \n"); + } + if (cs->isDeleted(cdol[i])) + { + fprintf(f,"=====Deleted Object Starts \n"); + printOldValues(f, cs, cdol[i]); + fprintf(f,"=====Deleted Object Ends \n"); + } + } +} + + +int sdotest::comparefiles(char* fn1, char*fn2) +{ + FILE *f1, *f2; + f1 = fopen(fn1,"r+"); + if (f1 == 0) + { + if (!silent) cout << "Cannot open file:" << fn1 << endl; + return 0; + } + f2 = fopen(fn2,"r+"); + if (f2 == 0) + { + if (!silent) cout << "Cannot open file:" << fn2 << endl; + if (ramping) + { + cout << "Creating it" << endl; + f2 = fopen(fn2,"w+"); + if (f2 == 0) + { + cout << "Cannot ramp up - failed on " << fn2 << endl; + return 0; + } + int c; + do + { + c = fgetc(f1); + if (!feof(f1)) fputc(c,f2); + else break; + } while (1); + fclose(f1); + fclose(f2); + return 1; + } + else + { + fclose(f1); + return 0; + } + } + + while (!feof(f1)) + { + if (fgetc(f1) != fgetc(f2)) + { + fclose(f1); + fclose(f2); + return 0; + } + } + fclose (f1); + + if (!feof(f2)) + { + fclose(f2); + return 0; + } + + fclose(f2); + return 1; +} + + +int sdotest::printseq(FILE *f, SequencePtr sptr) +{ + fprintf(f, "======================================\n"); + for (int i=0;i< sptr->size();i++) + { + try { + if (!sptr->isText(i)) + { + const Property& prp = sptr->getProperty(i); + if (!strcmp(prp.getType().getName(),"Department")) + { + DataObjectPtr pdep = sptr->getDataObjectValue(i); + if (pdep != 0) + { + const char * cs = pdep->getCString("name"); + if (cs != 0) + { + fprintf(f, "%s\n",cs); + } + else + { + fprintf(f," is empty \n"); + } + } + } + else + { + const char* stx = sptr->getCStringValue(i); + if (stx != 0) + { + fprintf(f,"%s\n",stx); + } + else + { + fprintf(f," is empty \n"); + } + } + } + else + { + const char* st = sptr->getCStringValue(i); + if (st != 0) + { + fprintf(f,"%s\n", st); + } + else + { + fprintf(f," is empty \n"); + } + } + } + catch (SDOPropertyNotSetException) + { + if (!silent) cout << "WRONG - got a property not set exception!!!" << endl; + return 0; + } + } + fprintf(f, "======================================\n"); + return 1; +} diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml1.xsd b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml1.xsd new file mode 100644 index 0000000000..54d78e0366 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml1.xsd @@ -0,0 +1,2245 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema version="1.0" xml:lang="en" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.w3.org/1999/xhtml" + xmlns="http://www.w3.org/1999/xhtml" + xmlns:xml="http://www.w3.org/XML/1998/namespace" + elementFormDefault="qualified"> + + <xs:annotation> + <xs:documentation> + XHTML 1.0 (Second Edition) Strict in XML Schema + + This is the same as HTML 4 Strict except for + changes due to the differences between XML and SGML. + + Namespace = http://www.w3.org/1999/xhtml + + For further information, see: http://www.w3.org/TR/xhtml1 + + Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio), + All Rights Reserved. + + The DTD version is identified by the PUBLIC and SYSTEM identifiers: + + PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" + + $Id: xhtml1-strict.xsd,v 1.2 2002/08/28 08:05:44 mimasa Exp $ + </xs:documentation> + </xs:annotation> + + <!-- <xs:import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="xml.xsd"/> --> + + <xs:annotation> + <xs:documentation> + ================ Character mnemonic entities ========================= + + XHTML entity sets are identified by the PUBLIC and SYSTEM identifiers: + + PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent" + + PUBLIC "-//W3C//ENTITIES Special for XHTML//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent" + + PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent" + </xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation> + ================== Imported Names ==================================== + </xs:documentation> + </xs:annotation> + + <xs:simpleType name="ContentType"> + <xs:annotation> + <xs:documentation> + media type, as per [RFC2045] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="ContentTypes"> + <xs:annotation> + <xs:documentation> + comma-separated list of media types, as per [RFC2045] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="Charset"> + <xs:annotation> + <xs:documentation> + a character encoding, as per [RFC2045] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="Charsets"> + <xs:annotation> + <xs:documentation> + a space separated list of character encodings, as per [RFC2045] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="LanguageCode"> + <xs:annotation> + <xs:documentation> + a language code, as per [RFC3066] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:language"/> + </xs:simpleType> + + <xs:simpleType name="Character"> + <xs:annotation> + <xs:documentation> + a single character, as per section 2.2 of [XML] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:length value="1" fixed="true"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="Number"> + <xs:annotation> + <xs:documentation> + one or more digits + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:nonNegativeInteger"> + <xs:pattern value="[0-9]+"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="tabindexNumber"> + <xs:annotation> + <xs:documentation> + tabindex attribute specifies the position of the current element + in the tabbing order for the current document. This value must be + a number between 0 and 32767. User agents should ignore leading zeros. + </xs:documentation> + </xs:annotation> + <xs:restriction base="Number"> + <xs:minInclusive value="0"/> + <xs:maxInclusive value="32767"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="LinkTypes"> + <xs:annotation> + <xs:documentation> + space-separated list of link types + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:NMTOKENS"/> + </xs:simpleType> + + <xs:simpleType name="MediaDesc"> + <xs:annotation> + <xs:documentation> + single or comma-separated list of media descriptors + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:pattern value="[^,]+(,\s*[^,]+)*"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="URI"> + <xs:annotation> + <xs:documentation> + a Uniform Resource Identifier, see [RFC2396] + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:anyURI"/> + </xs:simpleType> + + <xs:simpleType name="UriList"> + <xs:annotation> + <xs:documentation> + a space separated list of Uniform Resource Identifiers + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="Datetime"> + <xs:annotation> + <xs:documentation> + date and time information. ISO date format + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:dateTime"/> + </xs:simpleType> + + <xs:simpleType name="Script"> + <xs:annotation> + <xs:documentation> + script expression + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="StyleSheet"> + <xs:annotation> + <xs:documentation> + style sheet data + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="Text"> + <xs:annotation> + <xs:documentation> + used for titles etc. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"/> + </xs:simpleType> + + <xs:simpleType name="Length"> + <xs:annotation> + <xs:documentation> + nn for pixels or nn% for percentage length + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:pattern value="[-+]?(\d+|\d+(\.\d+)?%)"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="MultiLength"> + <xs:annotation> + <xs:documentation> + pixel, percentage, or relative + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:pattern value="[-+]?(\d+|\d+(\.\d+)?%)|[1-9]?(\d+)?\*"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="Pixels"> + <xs:annotation> + <xs:documentation> + integer representing length in pixels + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:nonNegativeInteger"/> + </xs:simpleType> + + <xs:annotation> + <xs:documentation> + these are used for image maps + </xs:documentation> + </xs:annotation> + + <xs:simpleType name="Shape"> + <xs:restriction base="xs:token"> + <xs:enumeration value="rect"/> + <xs:enumeration value="circle"/> + <xs:enumeration value="poly"/> + <xs:enumeration value="default"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="Coords"> + <xs:annotation> + <xs:documentation> + comma separated list of lengths + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:pattern + value="[-+]?(\d+|\d+(\.\d+)?%)(,\s*[-+]?(\d+|\d+(\.\d+)?%))*"/> + </xs:restriction> + </xs:simpleType> + + <xs:annotation> + <xs:documentation> + =================== Generic Attributes =============================== + </xs:documentation> + </xs:annotation> + + <xs:attributeGroup name="coreattrs"> + <xs:annotation> + <xs:documentation> + core attributes common to most elements + id document-wide unique id + class space separated list of classes + style associated style info + title advisory title/amplification + </xs:documentation> + </xs:annotation> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="class" type="xs:NMTOKENS"/> + <xs:attribute name="style" type="StyleSheet"/> + <xs:attribute name="title" type="Text"/> + </xs:attributeGroup> + + <xs:attributeGroup name="i18n"> + <xs:annotation> + <xs:documentation> + internationalization attributes + lang language code (backwards compatible) + xml:lang language code (as per XML 1.0 spec) + dir direction for weak/neutral text + </xs:documentation> + </xs:annotation> + <xs:attribute name="lang" type="LanguageCode"/> + <xs:attribute ref="xml:lang"/> + <xs:attribute name="dir"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="ltr"/> + <xs:enumeration value="rtl"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:attributeGroup> + + <xs:attributeGroup name="events"> + <xs:annotation> + <xs:documentation> + attributes for common UI events + onclick a pointer button was clicked + ondblclick a pointer button was double clicked + onmousedown a pointer button was pressed down + onmouseup a pointer button was released + onmousemove a pointer was moved onto the element + onmouseout a pointer was moved away from the element + onkeypress a key was pressed and released + onkeydown a key was pressed down + onkeyup a key was released + </xs:documentation> + </xs:annotation> + <xs:attribute name="onclick" type="Script"/> + <xs:attribute name="ondblclick" type="Script"/> + <xs:attribute name="onmousedown" type="Script"/> + <xs:attribute name="onmouseup" type="Script"/> + <xs:attribute name="onmouseover" type="Script"/> + <xs:attribute name="onmousemove" type="Script"/> + <xs:attribute name="onmouseout" type="Script"/> + <xs:attribute name="onkeypress" type="Script"/> + <xs:attribute name="onkeydown" type="Script"/> + <xs:attribute name="onkeyup" type="Script"/> + </xs:attributeGroup> + + <xs:attributeGroup name="focus"> + <xs:annotation> + <xs:documentation> + attributes for elements that can get the focus + accesskey accessibility key character + tabindex position in tabbing order + onfocus the element got the focus + onblur the element lost the focus + </xs:documentation> + </xs:annotation> + <xs:attribute name="accesskey" type="Character"/> + <xs:attribute name="tabindex" type="tabindexNumber"/> + <xs:attribute name="onfocus" type="Script"/> + <xs:attribute name="onblur" type="Script"/> + </xs:attributeGroup> +<!-- + <xs:attributeGroup name="attrs"> + <xs:attributeGroup ref="coreattrs"/> + <xs:attributeGroup ref="i18n"/> + <xs:attributeGroup ref="events"/> + </xs:attributeGroup> +--> + <xs:attributeGroup name="attrs"> + + <!-- coreattrs attribute group --> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="class" type="xs:NMTOKENS"/> + <xs:attribute name="style" type="StyleSheet"/> + <xs:attribute name="title" type="Text"/> + + <!-- i18n attribute group --> + <xs:attribute name="lang" type="LanguageCode"/> + <xs:attribute ref="xml:lang"/> + <xs:attribute name="dir"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="ltr"/> + <xs:enumeration value="rtl"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + + <!-- events attribute group --> + <xs:attribute name="onclick" type="Script"/> + <xs:attribute name="ondblclick" type="Script"/> + <xs:attribute name="onmousedown" type="Script"/> + <xs:attribute name="onmouseup" type="Script"/> + <xs:attribute name="onmouseover" type="Script"/> + <xs:attribute name="onmousemove" type="Script"/> + <xs:attribute name="onmouseout" type="Script"/> + <xs:attribute name="onkeypress" type="Script"/> + <xs:attribute name="onkeydown" type="Script"/> + <xs:attribute name="onkeyup" type="Script"/> + </xs:attributeGroup> + + + <xs:annotation> + <xs:documentation> + =================== Text Elements ==================================== + </xs:documentation> + </xs:annotation> + + <xs:group name="special.pre"> + <xs:choice> + <xs:element ref="br"/> + <xs:element ref="span"/> + <xs:element ref="bdo"/> + <xs:element ref="map"/> + </xs:choice> + </xs:group> + + <xs:group name="special"> + <xs:choice> + <xs:group ref="special.pre"/> + <xs:element ref="object"/> + <xs:element ref="img"/> + </xs:choice> + </xs:group> + + <xs:group name="fontstyle"> + <xs:choice> + <xs:element ref="tt"/> + <xs:element ref="i"/> + <xs:element ref="b"/> + <xs:element ref="big"/> + <xs:element ref="small"/> + </xs:choice> + </xs:group> + + <xs:group name="phrase"> + <xs:choice> + <xs:element ref="em"/> + <xs:element ref="strong"/> + <xs:element ref="dfn"/> + <xs:element ref="code"/> + <xs:element ref="q"/> + <xs:element ref="samp"/> + <xs:element ref="kbd"/> + <xs:element ref="var"/> + <xs:element ref="cite"/> + <xs:element ref="abbr"/> + <xs:element ref="acronym"/> + <xs:element ref="sub"/> + <xs:element ref="sup"/> + </xs:choice> + </xs:group> + + <xs:group name="inline.forms"> + <xs:choice> + <xs:element ref="input"/> + <xs:element ref="select"/> + <xs:element ref="textarea"/> + <xs:element ref="label"/> + <xs:element ref="button"/> + </xs:choice> + </xs:group> + + <xs:group name="misc.inline"> + <xs:choice> + <xs:element ref="ins"/> + <xs:element ref="del"/> + <xs:element ref="script"/> + </xs:choice> + </xs:group> + + <xs:group name="misc"> + <xs:annotation> + <xs:documentation> + these can only occur at block level + </xs:documentation> + </xs:annotation> + <xs:choice> + <xs:element ref="noscript"/> + <xs:group ref="misc.inline"/> + </xs:choice> + </xs:group> + + <xs:group name="inline"> + <xs:choice> + <xs:element ref="a"/> + <xs:group ref="special"/> + <xs:group ref="fontstyle"/> + <xs:group ref="phrase"/> + <xs:group ref="inline.forms"/> + </xs:choice> + </xs:group> + + <xs:complexType name="Inline" mixed="true"> + <xs:annotation> + <xs:documentation> + "Inline" covers inline or "text-level" elements + </xs:documentation> + </xs:annotation> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:group ref="inline"/> + <xs:group ref="misc.inline"/> + </xs:choice> + </xs:complexType> + + <xs:annotation> + <xs:documentation> + ================== Block level elements ============================== + </xs:documentation> + </xs:annotation> + + <xs:group name="heading"> + <xs:choice> + <xs:element ref="h1"/> + <xs:element ref="h2"/> + <xs:element ref="h3"/> + <xs:element ref="h4"/> + <xs:element ref="h5"/> + <xs:element ref="h6"/> + </xs:choice> + </xs:group> + + <xs:group name="lists"> + <xs:choice> + <xs:element ref="ul"/> + <xs:element ref="ol"/> + <xs:element ref="dl"/> + </xs:choice> + </xs:group> + + <xs:group name="blocktext"> + <xs:choice> + <xs:element ref="pre"/> + <xs:element ref="hr"/> + <xs:element ref="blockquote"/> + <xs:element ref="address"/> + </xs:choice> + </xs:group> + + <xs:group name="block"> + <xs:choice> + <xs:element ref="p"/> + <xs:group ref="heading"/> + <xs:element ref="div"/> + <xs:group ref="lists"/> + <xs:group ref="blocktext"/> + <xs:element ref="fieldset"/> + <xs:element ref="table"/> + </xs:choice> + </xs:group> + + <xs:complexType name="Block"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:group ref="block"/> + <xs:element ref="form"/> + <xs:group ref="misc"/> + </xs:choice> + </xs:complexType> + + <xs:complexType name="Flow" mixed="true"> + <xs:annotation> + <xs:documentation> + "Flow" mixes block and inline and is used for list items etc. + </xs:documentation> + </xs:annotation> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:group ref="block"/> + <xs:element ref="form"/> + <xs:group ref="inline"/> + <xs:group ref="misc"/> + </xs:choice> + </xs:complexType> + + <xs:annotation> + <xs:documentation> + ================== Content models for exclusions ===================== + </xs:documentation> + </xs:annotation> + + <xs:complexType name="a.content" mixed="true"> + <xs:annotation> + <xs:documentation> + a elements use "Inline" excluding a + </xs:documentation> + </xs:annotation> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:group ref="special"/> + <xs:group ref="fontstyle"/> + <xs:group ref="phrase"/> + <xs:group ref="inline.forms"/> + <xs:group ref="misc.inline"/> + </xs:choice> + </xs:complexType> + + <xs:complexType name="pre.content" mixed="true"> + <xs:annotation> + <xs:documentation> + pre uses "Inline" excluding big, small, sup or sup + </xs:documentation> + </xs:annotation> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="a"/> + <xs:group ref="fontstyle"/> + <xs:group ref="phrase"/> + <xs:group ref="special.pre"/> + <xs:group ref="misc.inline"/> + <xs:group ref="inline.forms"/> + </xs:choice> + </xs:complexType> + + <xs:complexType name="form.content"> + <xs:annotation> + <xs:documentation> + form uses "Block" excluding form + </xs:documentation> + </xs:annotation> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:group ref="block"/> + <xs:group ref="misc"/> + </xs:choice> + </xs:complexType> + + <xs:complexType name="button.content" mixed="true"> + <xs:annotation> + <xs:documentation> + button uses "Flow" but excludes a, form and form controls + </xs:documentation> + </xs:annotation> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="p"/> + <xs:group ref="heading"/> + <xs:element ref="div"/> + <xs:group ref="lists"/> + <xs:group ref="blocktext"/> + <xs:element ref="table"/> + <xs:group ref="special"/> + <xs:group ref="fontstyle"/> + <xs:group ref="phrase"/> + <xs:group ref="misc"/> + </xs:choice> + </xs:complexType> + + <xs:annotation> + <xs:documentation> + ================ Document Structure ================================== + </xs:documentation> + </xs:annotation> + + <xs:element name="html"> + <xs:complexType> + <xs:sequence> + <xs:element ref="head"/> + <xs:element ref="body"/> + </xs:sequence> + <xs:attributeGroup ref="i18n"/> + <xs:attribute name="id" type="xs:ID"/> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ================ Document Head ======================================= + </xs:documentation> + </xs:annotation> + + <xs:group name="head.misc"> + <xs:sequence> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="script"/> + <xs:element ref="style"/> + <xs:element ref="meta"/> + <xs:element ref="link"/> + <xs:element ref="object"/> + </xs:choice> + </xs:sequence> + </xs:group> + + <xs:element name="head"> + <xs:annotation> + <xs:documentation> + content model is "head.misc" combined with a single + title and an optional base element in any order + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:group ref="head.misc"/> + <xs:choice> + <xs:sequence> + <xs:element ref="title"/> + <xs:group ref="head.misc"/> + <xs:sequence minOccurs="0"> + <xs:element ref="base"/> + <xs:group ref="head.misc"/> + </xs:sequence> + </xs:sequence> + <xs:sequence> + <xs:element ref="base"/> + <xs:group ref="head.misc"/> + <xs:element ref="title"/> + <xs:group ref="head.misc"/> + </xs:sequence> + </xs:choice> + </xs:sequence> + <xs:attributeGroup ref="i18n"/> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="profile" type="URI"/> + </xs:complexType> + </xs:element> + + <xs:element name="title"> + <xs:annotation> + <xs:documentation> + The title element is not considered part of the flow of text. + It should be displayed, for example as the page header or + window title. Exactly one title is required per document. + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:attributeGroup ref="i18n"/> + <xs:attribute name="id" type="xs:ID"/> + </xs:complexType> + </xs:element> + + <xs:element name="base"> + <xs:annotation> + <xs:documentation> + document base URI + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attribute name="href" use="required" type="URI"/> + <xs:attribute name="id" type="xs:ID"/> + </xs:complexType> + </xs:element> + + <xs:element name="meta"> + <xs:annotation> + <xs:documentation> + generic metainformation + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attributeGroup ref="i18n"/> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="http-equiv"/> + <xs:attribute name="name"/> + <xs:attribute name="content" use="required"/> + <xs:attribute name="scheme"/> + </xs:complexType> + </xs:element> + + <xs:element name="link"> + <xs:annotation> + <xs:documentation> + Relationship values can be used in principle: + + a) for document specific toolbars/menus when used + with the link element in document head e.g. + start, contents, previous, next, index, end, help + b) to link to a separate style sheet (rel="stylesheet") + c) to make a link to a script (rel="script") + d) by stylesheets to control how collections of + html nodes are rendered into printed documents + e) to make a link to a printable version of this document + e.g. a PostScript or PDF version (rel="alternate" media="print") + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="charset" type="Charset"/> + <xs:attribute name="href" type="URI"/> + <xs:attribute name="hreflang" type="LanguageCode"/> + <xs:attribute name="type" type="ContentType"/> + <xs:attribute name="rel" type="LinkTypes"/> + <xs:attribute name="rev" type="LinkTypes"/> + <xs:attribute name="media" type="MediaDesc"/> + </xs:complexType> + </xs:element> + + <xs:element name="style"> + <xs:annotation> + <xs:documentation> + style info, which may include CDATA sections + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:attributeGroup ref="i18n"/> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="type" use="required" type="ContentType"/> + <xs:attribute name="media" type="MediaDesc"/> + <xs:attribute name="title" type="Text"/> + <xs:attribute ref="xml:space" fixed="preserve"/> + </xs:complexType> + </xs:element> + + <xs:element name="script"> + <xs:annotation> + <xs:documentation> + script statements, which may include CDATA sections + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="charset" type="Charset"/> + <xs:attribute name="type" use="required" type="ContentType"/> + <xs:attribute name="src" type="URI"/> + <xs:attribute name="defer"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="defer"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute ref="xml:space" fixed="preserve"/> + </xs:complexType> + </xs:element> + + <xs:element name="noscript"> + <xs:annotation> + <xs:documentation> + alternate content container for non script-based rendering + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:complexContent> + <xs:extension base="Block"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Document Body ==================================== + </xs:documentation> + </xs:annotation> + + <xs:element name="body"> + <xs:complexType> + <xs:complexContent> + <xs:extension base="Block"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="onload" type="Script"/> + <xs:attribute name="onunload" type="Script"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="div"> + <xs:annotation> + <xs:documentation> + generic language/style container + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Paragraphs ======================================= + </xs:documentation> + </xs:annotation> + + <xs:element name="p"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Headings ========================================= + + There are six levels of headings from h1 (the most important) + to h6 (the least important). + </xs:documentation> + </xs:annotation> + + <xs:element name="h1"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="h2"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="h3"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="h4"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="h5"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="h6"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Lists ============================================ + </xs:documentation> + </xs:annotation> + + <xs:element name="ul"> + <xs:annotation> + <xs:documentation> + Unordered list + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="li"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + </xs:complexType> + </xs:element> + + <xs:element name="ol"> + <xs:annotation> + <xs:documentation> + Ordered (numbered) list + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="li"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + </xs:complexType> + </xs:element> + + <xs:element name="li"> + <xs:annotation> + <xs:documentation> + list item + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + definition lists - dt for term, dd for its definition + </xs:documentation> + </xs:annotation> + + <xs:element name="dl"> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element ref="dt"/> + <xs:element ref="dd"/> + </xs:choice> + <xs:attributeGroup ref="attrs"/> + </xs:complexType> + </xs:element> + + <xs:element name="dt"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="dd"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Address ========================================== + </xs:documentation> + </xs:annotation> + + <xs:element name="address"> + <xs:annotation> + <xs:documentation> + information on author + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Horizontal Rule ================================== + </xs:documentation> + </xs:annotation> + + <xs:element name="hr"> + <xs:complexType> + <xs:attributeGroup ref="attrs"/> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Preformatted Text ================================ + </xs:documentation> + </xs:annotation> + + <xs:element name="pre"> + <xs:annotation> + <xs:documentation> + content is "Inline" excluding "img|object|big|small|sub|sup" + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="pre.content"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute ref="xml:space" fixed="preserve"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Block-like Quotes ================================ + </xs:documentation> + </xs:annotation> + + <xs:element name="blockquote"> + <xs:complexType> + <xs:complexContent> + <xs:extension base="Block"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="cite" type="URI"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Inserted/Deleted Text ============================ + + ins/del are allowed in block and inline content, but its + inappropriate to include block content within an ins element + occurring in inline content. + </xs:documentation> + </xs:annotation> + + <xs:element name="ins"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="cite" type="URI"/> + <xs:attribute name="datetime" type="Datetime"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="del"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="cite" type="URI"/> + <xs:attribute name="datetime" type="Datetime"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ================== The Anchor Element ================================ + </xs:documentation> + </xs:annotation> + + <xs:element name="a"> + <xs:annotation> + <xs:documentation> + content is "Inline" except that anchors shouldn't be nested + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="a.content"> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="focus"/> + <xs:attribute name="charset" type="Charset"/> + <xs:attribute name="type" type="ContentType"/> + <xs:attribute name="name" type="xs:NMTOKEN"/> + <xs:attribute name="href" type="URI"/> + <xs:attribute name="hreflang" type="LanguageCode"/> + <xs:attribute name="rel" type="LinkTypes"/> + <xs:attribute name="rev" type="LinkTypes"/> + <xs:attribute name="shape" default="rect" type="Shape"/> + <xs:attribute name="coords" type="Coords"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ===================== Inline Elements ================================ + </xs:documentation> + </xs:annotation> + + <xs:element name="span"> + <xs:annotation> + <xs:documentation> + generic language/style container + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="bdo"> + <xs:annotation> + <xs:documentation> + I18N BiDi over-ride + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="coreattrs"/> + <xs:attributeGroup ref="events"/> + <xs:attribute name="lang" type="LanguageCode"/> + <xs:attribute ref="xml:lang"/> + <xs:attribute name="dir" use="required"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="ltr"/> + <xs:enumeration value="rtl"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="br"> + <xs:annotation> + <xs:documentation> + forced line break + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attributeGroup ref="coreattrs"/> + </xs:complexType> + </xs:element> + + <xs:element name="em"> + <xs:annotation> + <xs:documentation> + emphasis + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="strong"> + <xs:annotation> + <xs:documentation> + strong emphasis + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="dfn"> + <xs:annotation> + <xs:documentation> + definitional + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="code"> + <xs:annotation> + <xs:documentation> + program code + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="samp"> + <xs:annotation> + <xs:documentation> + sample + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="kbd"> + <xs:annotation> + <xs:documentation> + something user would type + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="var"> + <xs:annotation> + <xs:documentation> + variable + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="cite"> + <xs:annotation> + <xs:documentation> + citation + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="abbr"> + <xs:annotation> + <xs:documentation> + abbreviation + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="acronym"> + <xs:annotation> + <xs:documentation> + acronym + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="q"> + <xs:annotation> + <xs:documentation> + inlined quote + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="cite" type="URI"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="sub"> + <xs:annotation> + <xs:documentation> + subscript + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="sup"> + <xs:annotation> + <xs:documentation> + superscript + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="tt"> + <xs:annotation> + <xs:documentation> + fixed pitch font + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="i"> + <xs:annotation> + <xs:documentation> + italic font + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="b"> + <xs:annotation> + <xs:documentation> + bold font + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="big"> + <xs:annotation> + <xs:documentation> + bigger font + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="small"> + <xs:annotation> + <xs:documentation> + smaller font + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ==================== Object ====================================== + + object is used to embed objects as part of HTML pages. + param elements should precede other content. Parameters + can also be expressed as attribute/value pairs on the + object element itself when brevity is desired. + </xs:documentation> + </xs:annotation> + + <xs:element name="object"> + <xs:complexType mixed="true"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="param"/> + <xs:group ref="block"/> + <xs:element ref="form"/> + <xs:group ref="inline"/> + <xs:group ref="misc"/> + </xs:choice> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="declare"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="declare"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="classid" type="URI"/> + <xs:attribute name="codebase" type="URI"/> + <xs:attribute name="data" type="URI"/> + <xs:attribute name="type" type="ContentType"/> + <xs:attribute name="codetype" type="ContentType"/> + <xs:attribute name="archive" type="UriList"/> + <xs:attribute name="standby" type="Text"/> + <xs:attribute name="height" type="Length"/> + <xs:attribute name="width" type="Length"/> + <xs:attribute name="usemap" type="URI"/> + <xs:attribute name="name" type="xs:NMTOKEN"/> + <xs:attribute name="tabindex" type="tabindexNumber"/> + </xs:complexType> + </xs:element> + + <xs:element name="param"> + <xs:annotation> + <xs:documentation> + param is used to supply a named property value. + In XML it would seem natural to follow RDF and support an + abbreviated syntax where the param elements are replaced + by attribute value pairs on the object start tag. + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attribute name="id" type="xs:ID"/> + <xs:attribute name="name"/> + <xs:attribute name="value"/> + <xs:attribute name="valuetype" default="data"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="data"/> + <xs:enumeration value="ref"/> + <xs:enumeration value="object"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="type" type="ContentType"/> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + =================== Images =========================================== + + To avoid accessibility problems for people who aren't + able to see the image, you should provide a text + description using the alt and longdesc attributes. + In addition, avoid the use of server-side image maps. + Note that in this DTD there is no name attribute. That + is only available in the transitional and frameset DTD. + </xs:documentation> + </xs:annotation> + + <xs:element name="img"> + <xs:complexType> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="src" use="required" type="URI"/> + <xs:attribute name="alt" use="required" type="Text"/> + <xs:attribute name="longdesc" type="URI"/> + <xs:attribute name="height" type="Length"/> + <xs:attribute name="width" type="Length"/> + <xs:attribute name="usemap" type="URI"> + <xs:annotation> + <xs:documentation> + usemap points to a map element which may be in this document + or an external document, although the latter is not widely supported + </xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="ismap"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="ismap"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ================== Client-side image maps ============================ + + These can be placed in the same document or grouped in a + separate document although this isn't yet widely supported + </xs:documentation> + </xs:annotation> + + <xs:element name="map"> + <xs:complexType> + <xs:choice> + <xs:choice maxOccurs="unbounded"> + <xs:group ref="block"/> + <xs:element ref="form"/> + <xs:group ref="misc"/> + </xs:choice> + <xs:element maxOccurs="unbounded" ref="area"/> + </xs:choice> + <xs:attributeGroup ref="i18n"/> + <xs:attributeGroup ref="events"/> + <xs:attribute name="id" use="required" type="xs:ID"/> + <xs:attribute name="class"/> + <xs:attribute name="style" type="StyleSheet"/> + <xs:attribute name="title" type="Text"/> + <xs:attribute name="name" type="xs:NMTOKEN"/> + </xs:complexType> + </xs:element> + + <xs:element name="area"> + <xs:complexType> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="focus"/> + <xs:attribute name="shape" default="rect" type="Shape"/> + <xs:attribute name="coords" type="Coords"/> + <xs:attribute name="href" type="URI"/> + <xs:attribute name="nohref"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="nohref"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="alt" use="required" type="Text"/> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ================ Forms =============================================== + </xs:documentation> + </xs:annotation> + + <xs:element name="form"> + <xs:complexType> + <xs:complexContent> + <xs:extension base="form.content"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="action" use="required" type="URI"/> + <xs:attribute name="method" default="get"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="get"/> + <xs:enumeration value="post"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="enctype" type="ContentType" + default="application/x-www-form-urlencoded"/> + <xs:attribute name="onsubmit" type="Script"/> + <xs:attribute name="onreset" type="Script"/> + <xs:attribute name="accept" type="ContentTypes"/> + <xs:attribute name="accept-charset" type="Charsets"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="label"> + <xs:annotation> + <xs:documentation> + Each label must not contain more than ONE field + Label elements shouldn't be nested. + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="for" type="xs:IDREF"/> + <xs:attribute name="accesskey" type="Character"/> + <xs:attribute name="onfocus" type="Script"/> + <xs:attribute name="onblur" type="Script"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:simpleType name="InputType"> + <xs:restriction base="xs:token"> + <xs:enumeration value="text"/> + <xs:enumeration value="password"/> + <xs:enumeration value="checkbox"/> + <xs:enumeration value="radio"/> + <xs:enumeration value="submit"/> + <xs:enumeration value="reset"/> + <xs:enumeration value="file"/> + <xs:enumeration value="hidden"/> + <xs:enumeration value="image"/> + <xs:enumeration value="button"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="input"> + <xs:annotation> + <xs:documentation> + form control + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="focus"/> + <xs:attribute name="type" default="text" type="InputType"/> + <xs:attribute name="name"> + <xs:annotation> + <xs:documentation> + the name attribute is required for all but submit & reset + </xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="value"/> + <xs:attribute name="checked"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="checked"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="disabled"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="disabled"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="readonly"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="readonly"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="size"/> + <xs:attribute name="maxlength" type="Number"/> + <xs:attribute name="src" type="URI"/> + <xs:attribute name="alt"/> + <xs:attribute name="usemap" type="URI"/> + <xs:attribute name="onselect" type="Script"/> + <xs:attribute name="onchange" type="Script"/> + <xs:attribute name="accept" type="ContentTypes"/> + </xs:complexType> + </xs:element> + + <xs:element name="select"> + <xs:annotation> + <xs:documentation> + option selector + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element ref="optgroup"/> + <xs:element ref="option"/> + </xs:choice> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="name"/> + <xs:attribute name="size" type="Number"/> + <xs:attribute name="multiple"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="multiple"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="disabled"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="disabled"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="tabindex" type="tabindexNumber"/> + <xs:attribute name="onfocus" type="Script"/> + <xs:attribute name="onblur" type="Script"/> + <xs:attribute name="onchange" type="Script"/> + </xs:complexType> + </xs:element> + + <xs:element name="optgroup"> + <xs:annotation> + <xs:documentation> + option group + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="option"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="disabled"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="disabled"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="label" use="required" type="Text"/> + </xs:complexType> + </xs:element> + + <xs:element name="option"> + <xs:annotation> + <xs:documentation> + selectable choice + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="selected"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="selected"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="disabled"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="disabled"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="label" type="Text"/> + <xs:attribute name="value"/> + </xs:complexType> + </xs:element> + + <xs:element name="textarea"> + <xs:annotation> + <xs:documentation> + multi-line text field + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="focus"/> + <xs:attribute name="name"/> + <xs:attribute name="rows" use="required" type="Number"/> + <xs:attribute name="cols" use="required" type="Number"/> + <xs:attribute name="disabled"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="disabled"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="readonly"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="readonly"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="onselect" type="Script"/> + <xs:attribute name="onchange" type="Script"/> + </xs:complexType> + </xs:element> + + <xs:element name="fieldset"> + <xs:annotation> + <xs:documentation> + The fieldset element is used to group form fields. + Only one legend element should occur in the content + and if present should only be preceded by whitespace. + + NOTE: this content model is different from the XHTML 1.0 DTD, + closer to the intended content model in HTML4 DTD + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:sequence> + <xs:element ref="legend"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:group ref="block"/> + <xs:element ref="form"/> + <xs:group ref="inline"/> + <xs:group ref="misc"/> + </xs:choice> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + </xs:complexType> + </xs:element> + + <xs:element name="legend"> + <xs:annotation> + <xs:documentation> + fieldset label + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="accesskey" type="Character"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="button"> + <xs:annotation> + <xs:documentation> + Content is "Flow" excluding a, form and form controls + </xs:documentation> + </xs:annotation> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="button.content"> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="focus"/> + <xs:attribute name="name"/> + <xs:attribute name="value"/> + <xs:attribute name="type" default="submit"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="button"/> + <xs:enumeration value="submit"/> + <xs:enumeration value="reset"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="disabled"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="disabled"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + ======================= Tables ======================================= + + Derived from IETF HTML table standard, see [RFC1942] + </xs:documentation> + </xs:annotation> + + <xs:simpleType name="TFrame"> + <xs:annotation> + <xs:documentation> + The border attribute sets the thickness of the frame around the + table. The default units are screen pixels. + + The frame attribute specifies which parts of the frame around + the table should be rendered. The values are not the same as + CALS to avoid a name clash with the valign attribute. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:token"> + <xs:enumeration value="void"/> + <xs:enumeration value="above"/> + <xs:enumeration value="below"/> + <xs:enumeration value="hsides"/> + <xs:enumeration value="lhs"/> + <xs:enumeration value="rhs"/> + <xs:enumeration value="vsides"/> + <xs:enumeration value="box"/> + <xs:enumeration value="border"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="TRules"> + <xs:annotation> + <xs:documentation> + The rules attribute defines which rules to draw between cells: + + If rules is absent then assume: + "none" if border is absent or border="0" otherwise "all" + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:token"> + <xs:enumeration value="none"/> + <xs:enumeration value="groups"/> + <xs:enumeration value="rows"/> + <xs:enumeration value="cols"/> + <xs:enumeration value="all"/> + </xs:restriction> + </xs:simpleType> + + <xs:attributeGroup name="cellhalign"> + <xs:annotation> + <xs:documentation> + horizontal alignment attributes for cell contents + + char alignment char, e.g. char=':' + charoff offset for alignment char + </xs:documentation> + </xs:annotation> + <xs:attribute name="align"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="left"/> + <xs:enumeration value="center"/> + <xs:enumeration value="right"/> + <xs:enumeration value="justify"/> + <xs:enumeration value="char"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="char" type="Character"/> + <xs:attribute name="charoff" type="Length"/> + </xs:attributeGroup> + + <xs:attributeGroup name="cellvalign"> + <xs:annotation> + <xs:documentation> + vertical alignment attributes for cell contents + </xs:documentation> + </xs:annotation> + <xs:attribute name="valign"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="top"/> + <xs:enumeration value="middle"/> + <xs:enumeration value="bottom"/> + <xs:enumeration value="baseline"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:attributeGroup> + + <xs:element name="table"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" ref="caption"/> + <xs:choice> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="col"/> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="colgroup"/> + </xs:choice> + <xs:element minOccurs="0" ref="thead"/> + <xs:element minOccurs="0" ref="tfoot"/> + <xs:choice> + <xs:element maxOccurs="unbounded" ref="tbody"/> + <xs:element maxOccurs="unbounded" ref="tr"/> + </xs:choice> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="summary" type="Text"/> + <xs:attribute name="width" type="Length"/> + <xs:attribute name="border" type="Pixels"/> + <xs:attribute name="frame" type="TFrame"/> + <xs:attribute name="rules" type="TRules"/> + <xs:attribute name="cellspacing" type="Length"/> + <xs:attribute name="cellpadding" type="Length"/> + </xs:complexType> + </xs:element> + + <xs:element name="caption"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Inline"> + <xs:attributeGroup ref="attrs"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:annotation> + <xs:documentation> + Use thead to duplicate headers when breaking table + across page boundaries, or for static headers when + tbody sections are rendered in scrolling panel. + + Use tfoot to duplicate footers when breaking table + across page boundaries, or for static footers when + tbody sections are rendered in scrolling panel. + + Use multiple tbody sections when rules are needed + between groups of table rows. + </xs:documentation> + </xs:annotation> + + <xs:element name="thead"> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="tr"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:complexType> + </xs:element> + + <xs:element name="tfoot"> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="tr"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:complexType> + </xs:element> + + <xs:element name="tbody"> + <xs:complexType> + <xs:sequence> + <xs:element maxOccurs="unbounded" ref="tr"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:complexType> + </xs:element> + + <xs:element name="colgroup"> + <xs:annotation> + <xs:documentation> + colgroup groups a set of col elements. It allows you to group + several semantically related columns together. + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="col"/> + </xs:sequence> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="span" default="1" type="Number"/> + <xs:attribute name="width" type="MultiLength"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:complexType> + </xs:element> + + <xs:element name="col"> + <xs:annotation> + <xs:documentation> + col elements define the alignment properties for cells in + one or more columns. + + The width attribute specifies the width of the columns, e.g. + + width=64 width in screen pixels + width=0.5* relative width of 0.5 + + The span attribute causes the attributes of one + col element to apply to more than one column. + </xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="span" default="1" type="Number"/> + <xs:attribute name="width" type="MultiLength"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:complexType> + </xs:element> + + <xs:element name="tr"> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element ref="th"/> + <xs:element ref="td"/> + </xs:choice> + <xs:attributeGroup ref="attrs"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:complexType> + </xs:element> + + <xs:simpleType name="Scope"> + <xs:annotation> + <xs:documentation> + Scope is simpler than headers attribute for common tables + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:token"> + <xs:enumeration value="row"/> + <xs:enumeration value="col"/> + <xs:enumeration value="rowgroup"/> + <xs:enumeration value="colgroup"/> + </xs:restriction> + </xs:simpleType> + + <xs:annotation> + <xs:documentation> + th is for headers, td for data and for cells acting as both + </xs:documentation> + </xs:annotation> + + <xs:element name="th"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="abbr" type="Text"/> + <xs:attribute name="axis"/> + <xs:attribute name="headers" type="xs:IDREFS"/> + <xs:attribute name="scope" type="Scope"/> + <xs:attribute name="rowspan" default="1" type="Number"/> + <xs:attribute name="colspan" default="1" type="Number"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="td"> + <xs:complexType mixed="true"> + <xs:complexContent> + <xs:extension base="Flow"> + <xs:attributeGroup ref="attrs"/> + <xs:attribute name="abbr" type="Text"/> + <xs:attribute name="axis"/> + <xs:attribute name="headers" type="xs:IDREFS"/> + <xs:attribute name="scope" type="Scope"/> + <xs:attribute name="rowspan" default="1" type="Number"/> + <xs:attribute name="colspan" default="1" type="Number"/> + <xs:attributeGroup ref="cellhalign"/> + <xs:attributeGroup ref="cellvalign"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml_in.xml b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml_in.xml new file mode 100644 index 0000000000..73e91260a8 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml_in.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + + <feed xmlns="http://www.w3.org/2005/Atom"> + <title type="text">dive into mark</title> + <subtitle type="html"> + A <em>lot</em> of effort + went into making this effortless + </subtitle> + <updated>2005-07-31T12:29:29Z</updated> + <id>tag:example.org,2003:3</id> + <link rel="alternate" type="text/html" hreflang="en" href="http://example.org/"/> + <link rel="self" type="application/atom+xml" href="http://example.org/feed.atom"/> + <rights>Copyright (c) 2003, Mark Pilgrim</rights> + <generator uri="http://www.example.com/" version="1.0"> + Example Toolkit + </generator> + <entry> + <title>Atom draft-07 snapshot</title> + <link rel="alternate" type="text/html" href="http://example.org/2005/04/02/atom"/> + <link rel="enclosure" type="audio/mpeg" length="1337" href="http://example.org/audio/ph34r_my_podcast.mp3"/> + <id>tag:example.org,2003:3.2397</id> + <updated>2005-07-31T12:29:29Z</updated> + <published>2003-12-13T08:29:29-04:00</published> + <author> + <name>Mark Pilgrim</name> + <uri>http://example.org/</uri> + <email>f8dy@example.com</email> + </author> + <contributor> + <name>Sam Ruby</name> + </contributor> + <contributor> + <name>Joe Gregorio</name> + </contributor> + <content type="xhtml" xml:lang="en" xml:base="http://diveintomark.org/"> + <div xmlns="http://www.w3.org/1999/xhtml"> + <p><i>[Update: The Atom draft is finished.]</i></p> + <div class="myclass"><p>Hello</p></div> + </div> + </content> + </entry> + </feed>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml_out.txt b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml_out.txt new file mode 100644 index 0000000000..d485768c7e --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sdo/runtime/core/test/xhtml_out.txt @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<feed xmlns="http://www.w3.org/2005/Atom" xsi:type="feedType" xmlns:tns2="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.w3.org/2005/Atom"> + <title type="text">dive into mark</title> + <subtitle type="html"> + A <em>lot</em> of effort + went into making this effortless + </subtitle> + <updated>2005-07-31T12:29:29Z</updated> + <id>tag:example.org,2003:3</id> + <link href="http://example.org/" rel="alternate" type="text/html" hreflang="en"></link> + <link href="http://example.org/feed.atom" rel="self" type="application/atom+xml"></link> + <rights>Copyright (c) 2003, Mark Pilgrim</rights> + <generator uri="http://www.example.com/" version="1.0"> + Example Toolkit + </generator> + <entry> + <title>Atom draft-07 snapshot</title> + <link href="http://example.org/2005/04/02/atom" rel="alternate" type="text/html"></link> + <link href="http://example.org/audio/ph34r_my_podcast.mp3" rel="enclosure" type="audio/mpeg" length="1337"></link> + <id>tag:example.org,2003:3.2397</id> + <updated>2005-07-31T12:29:29Z</updated> + <published>2003-12-13T08:29:29-04:00</published> + <author> + <name>Mark Pilgrim</name> + <uri>http://example.org/</uri> + <email>f8dy@example.com</email> + </author> + <contributor> + <name>Sam Ruby</name> + </contributor> + <contributor> + <name>Joe Gregorio</name> + </contributor> + <content type="xhtml" lang="en" base="http://diveintomark.org/"><lang>en</lang><base>http://diveintomark.org/</base> + <tns2:div xsi:type="div"> + <tns2:p><tns2:i>[Update: The Atom draft is finished.]</tns2:i></tns2:p> + <tns2:div class="myclass"><tns2:p>Hello</tns2:p></tns2:div> + </tns2:div> + </content> + </entry> + </feed> |