| --- | |
| title: Using PdxInstanceFactory to Create PdxInstances | |
| --- | |
| <!-- | |
| Licensed to the Apache Software Foundation (ASF) under one or more | |
| contributor license agreements. See the NOTICE file distributed with | |
| this work for additional information regarding copyright ownership. | |
| The ASF licenses this file to You under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with | |
| the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| You can use the `PdxInstanceFactory` API to create a `PdxInstance` from raw data when the domain class is not available on the server. | |
| Creating a `PdxInstance` can be particularly useful when you need an instance of a domain class for plug-in code such as a function or a loader. If you have raw data for the domain object (the class name and each field's type and data), then you can explicitly create a `PdxInstance`. The `PdxInstanceFactory` API is very similar to the `PdxWriter` API except that after writing each field, you need to call the create method which returns the created `PdxInstance`. | |
| ## PdxInstance Example | |
| The following is a code example of creating a `PdxInstance`. | |
| ``` pre | |
| class Person | |
| { | |
| private: | |
| char* m_name; | |
| int m_id; | |
| int m_age; | |
| public: | |
| Person() { } | |
| Person(char* name, int id, int age) | |
| { | |
| m_name = name; | |
| m_id = id; | |
| m_age = age; | |
| } | |
| char* getName() const | |
| { | |
| return m_name; | |
| } | |
| int getID() | |
| { | |
| return m_id; | |
| } | |
| int getAge() | |
| { | |
| return m_age; | |
| } | |
| }; | |
| int main(int argc, char ** argv) | |
| { | |
| try | |
| { | |
| // Create a Cache. | |
| CacheFactoryPtr cacheFactory = CacheFactory::createCacheFactory(); | |
| CachePtr cachePtr = cacheFactory->set("cache-xml-file", | |
| "XMLs/clientPdxInstance.xml")->create(); | |
| LOGINFO("Created the <%=vars.product_name%> Cache"); | |
| // Get the example Region from the Cache which is declared in the | |
| // Cache XML file. | |
| RegionPtr regionPtr = cachePtr->getRegion("Person"); | |
| LOGINFO("Obtained the Region from the Cache."); | |
| Person* p = new Person("Jack", 7, 21); | |
| //PdxInstanceFactory for Person class | |
| PdxInstanceFactoryPtr pif = cachePtr->createPdxInstanceFactory("Person"); | |
| LOGINFO("Created PdxInstanceFactory for Person class"); | |
| pif->writeString("m_name", p->getName()); | |
| pif->writeInt("m_id", p->getID()); | |
| pif->markIdentityField("m_id"); | |
| pif->writeInt("m_age", p->getAge()); | |
| PdxInstancePtr pdxInstance = pif->create(); | |
| LOGINFO("Created PdxInstance for Person class"); | |
| regionPtr->put("Key1", pdxInstance); | |
| LOGINFO("Populated PdxInstance Object"); | |
| PdxInstancePtr retPdxInstance = regionPtr->get("Key1"); | |
| LOGINFO("Got PdxInstance Object"); | |
| int id = 0; | |
| retPdxInstance->getField("m_id", id); | |
| int age = 0; | |
| retPdxInstance->getField("m_age", age); | |
| char* name = NULL; | |
| retPdxInstance->getField("m_name", &name); | |
| if (id == p->getID()&& age == p->getAge() && strcmp(name, p->getName()) == 0 | |
| && retPdxInstance->isIdentityField("m_id") == true) | |
| LOGINFO("PdxInstance returns all fields value expected"); | |
| else | |
| LOGINFO("PdxInstance doesn't returns all fields value expected"); | |
| delete p; | |
| // Close the Cache. | |
| cachePtr->close(); | |
| LOGINFO("Closed the Cache"); | |
| } | |
| // An exception should not occur | |
| catch(const Exception & geodeExcp) | |
| { | |
| LOGERROR("PdxInstance Exception: %s", geodeExcp.getMessage()); | |
| } | |
| } | |
| ``` | |