blob: 7f570efb76e28525ae0d9f9970ef649a46670695 [file]
/*
*
* 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 "samples.h"
using namespace std;
void ObjectCreation::sample()
{
cout << " ********** Sample ObjectCreation **********" << endl;
try {
/**
* Get a data factory. With it we can either create metadata
* or load it from an XSD.
*/
DataFactoryPtr mdg = DataFactory::getDataFactory();
/**
* Add some Types to the data factory..
* The booleans at on addType are:
* "isSequenced", "isOpen" "isAbstract" and "isDataType"
*/
mdg->addType("myspace","Company");
mdg->addType("myspace","Department");
/**
* Manager is going to be a sequenced type...
*/
mdg->addType("myspace","Manager", true, false);
mdg->addType("myspace","Employee");
/**
* We will make employee and manager sub-types of 'person'
*/
mdg->addType("myspace","Person", true, false);
/**
* having all the types defined, we can now define the tree
* by giving properties to the types.
*/
/**
* We could use the API passing in name and URI for each
* Type , or get the Types back and use them directly.
* Here we get back the types to use...
*/
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& tm = mdg->getType("myspace","Manager");
const Type& td = mdg->getType("myspace","Department");
const Type& te = mdg->getType("myspace","Employee");
const Type& tp = mdg->getType("myspace","Person");
/**
* Example 1 - add a property of type String to type company
*/
mdg->addPropertyToType(tc,"name",ts);
/**
* Example 2 - add using the name of the company instead of the
* type...
*/
mdg->addPropertyToType("myspace","Company","address",ts);
/**
* Example 3 - add a many valued property
*/
mdg->addPropertyToType(tc,"departments", "myspace","Department",
true);
/**
* Example 4 - add a reference property
*/
mdg->addPropertyToType(tc,"employee of the month", "myspace",
"Employee",false, false, false);
/**
* Add other department properties...
*/
mdg->addPropertyToType(td,"name", ts);
mdg->addPropertyToType(td,"id", ti);
mdg->addPropertyToType(td,"manager", tm);
mdg->addPropertyToType(td,"employees",te,true,false,true);
/**
* Add a name to the person
*/
mdg->addPropertyToType(tp,"name", ts);
/**
* Make employees and mamagers both substypes of person
*/
mdg->setBaseType(te,tp);
mdg->setBaseType(tm,tp);
/**
* And give them different properties of their own.
*/
mdg->addPropertyToType(tm,"officeid", ts);
mdg->addPropertyToType(te,"cubelocation", ts);
/**
* The data structure looks like this:
* Company
* ----name (String)
* ----address *String)
* ----departments (Department, many valued)
* ----employee of the month ( Employee - reference)
* Person
* ----name (String)
* Employee
* ----name (String - inherited from Person)
* ----cubelocation (String)
* Manager
* ----name (String - inherited from Person)
* ----officeid (String)
* Department
* ----name (String)
* ----id (Integer)
* ---- manager (Manager)
* ---- employees (Employee - many valued)
/**
* create an object of type Company using the DataFactory
*/
DataObjectPtr dor = mdg->create((Type&)tc);
/**
* Set the company name to Acme
*/
dor->setCString("name","Acme");
/**
* Set up the two departments - using the
* DataObject createDataObject API
*/
DataObjectPtr dep1 = dor->createDataObject("departments");
dep1->setCString("name","Development");
dep1->setInteger("id",100);
DataObjectPtr man1 = dep1->createDataObject("manager");
man1->setCString("name","Herve Jones");
DataObjectPtr dep2= dor->createDataObject("departments");
dep2->setCString("name","Marketing");
dep2->setInteger("id",200);
DataObjectPtr man2 = dep2->createDataObject("manager");
man1->setCString("name","August Phan");
/**
* Give the departments some employees
*/
DataObjectPtr emp1 = dep1->createDataObject("employees");
emp1->setCString("name","Fred Appleby");
emp1->setCString("cubelocation","100-A");
DataObjectPtr emp2 = dep1->createDataObject("employees");
emp2->setCString("name","Jane Bloggs");
emp2->setCString("cubelocation","100-B");
DataObjectPtr emp3 = dep2->createDataObject("employees");
emp3->setCString("name","Robin Corbet");
emp3->setCString("cubelocation","200-A");
DataObjectPtr emp4 = dep2->createDataObject("employees");
emp4->setCString("name","Martha Denby");
emp4->setCString("cubelocation","200-B");
cout << "Company Name:" << dor->getCString("name") << endl;
DataObjectList& depts = dor->getList("departments");
for (int i=0;i<depts.size();i++)
{
cout << " Department Name:" << depts[i]->getCString("name") << endl;
DataObjectList& emps = depts[i]->getList("employees");
for (int j=0;j<emps.size();j++)
{
cout << " Employee Name:" << emps[j]->getCString("name") << endl;
}
}
}
catch (SDORuntimeException e)
{
cout << "Exception in ObjectCreation" <<endl;
cout << e;
}
cout << " ********** Sample ends ********************" << endl;
return;
}