osaf/services/saf/immsv/immloadd/imm_loader.cc             |   11 +-
 osaf/services/saf/immsv/immloadd/imm_pbe_load.cc           |    2 +-
 osaf/services/saf/immsv/immnd/ImmModel.cc                  |   82 +++++-
 osaf/services/saf/immsv/immnd/immnd_evt.c                  |   12 +
 osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.17.xsd |  183 +++++++++++++
 5 files changed, 285 insertions(+), 5 deletions(-)


This flag is only allowed to be set on attributes that have a default value.
Attributes with this flag will never be NULL.

Adding this flag to an existing attribute (schema change) will be allowed after 
checking for ccb interference and existing objects of the class.

When there's an attempt to set NULL value (or to delete all values with 
ATTR_VALUES_DELETE) to attributes with this flag, default value will be set.
The AttrMod will be changed to ATTR_VALUES_REPLACE (attrValuesNumber = 1, 
attrValues is default value) and sent to OI.

ImmAttrValue::operator= is used to assign value to ImmAttrValue.
This will also work with ImmAttrMultiValue (head value will be assigned).

diff --git a/osaf/services/saf/immsv/immloadd/imm_loader.cc 
b/osaf/services/saf/immsv/immloadd/imm_loader.cc
--- a/osaf/services/saf/immsv/immloadd/imm_loader.cc
+++ b/osaf/services/saf/immsv/immloadd/imm_loader.cc
@@ -1720,7 +1720,8 @@ static bool loadXsd(const char *xsdFile)
                     strcmp(value, "SA_INITIALIZED") && strcmp(value, 
"SA_PERSISTENT") &&
                     strcmp(value, "SA_CACHED") && strcmp(value, "SA_NOTIFY") &&
                     strcmp(value, "SA_NO_DUPLICATES") && strcmp(value, 
"SA_NO_DANGLING") &&
-                    strcmp(value, "SA_DN") && strcmp(value, 
"SA_DEFAULT_REMOVED")) {
+                    strcmp(value, "SA_DN") && strcmp(value, 
"SA_DEFAULT_REMOVED") &&
+                    strcmp(value, "SA_STRONG_DEFAULT")) {
                 attrFlagSet.insert(value);
             }
         }
@@ -1797,6 +1798,10 @@ static SaImmAttrFlagsT charsToFlagsHelpe
     {
         return SA_IMM_ATTR_DEFAULT_REMOVED;
     }
+    else if (len == strlen("SA_STRONG_DEFAULT") && strncmp((const char*)str, 
"SA_STRONG_DEFAULT", len) == 0)
+    {
+        return SA_IMM_ATTR_STRONG_DEFAULT;
+    }
 
     std::string unflag((char *)str, len);
     if(!isXsdLoaded) {
@@ -2187,7 +2192,7 @@ int loadImmXML(std::string xmldir, std::
 
     version.releaseCode   = 'A';
     version.majorVersion  = 2;
-    version.minorVersion  = 16;
+    version.minorVersion  = 17;
 
     TRACE("Loading from %s/%s", xmldir.c_str(), file.c_str());
 
@@ -2638,7 +2643,7 @@ int immsync(int maxBatchSize)
 
     version.releaseCode   = 'A';
     version.majorVersion  = 2;
-    version.minorVersion  = 16;
+    version.minorVersion  = 17;
 
     int retries = 0;
     do
diff --git a/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc 
b/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
--- a/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
+++ b/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
@@ -745,7 +745,7 @@ bool loadObjectsFromPbe(void* pbeHandle,
 
 int loadImmFromPbe(void* pbeHandle, bool preload)
 {
-       SaVersionT             version = {'A', 2, 16};
+       SaVersionT             version = {'A', 2, 17};
        SaImmHandleT           immHandle=0LL;
        SaImmAdminOwnerHandleT ownerHandle=0LL;
        SaImmCcbHandleT        ccbHandle=0LL;
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc 
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -3215,6 +3215,11 @@ ImmModel::classCreate(const ImmsvOmClass
                 LOG_NO("ERR_INVALID_PARAM: RDN '%s' cannot have 
SA_IMM_ATTR_DEFAULT_REMOVED flag", attNm);
                 illegal = 1;
             }
+
+            if (attr->attrFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+                LOG_NO("ERR_INVALID_PARAM: RDN '%s' cannot have 
SA_IMM_ATTR_STRONG_DEFAULT flag", attNm);
+                illegal = 1;
+            }
         }
 
         if(attr->attrFlags & SA_IMM_ATTR_NO_DANGLING) {
@@ -3251,6 +3256,12 @@ ImmModel::classCreate(const ImmsvOmClass
             illegal = 1;
         }
 
+        if ((attr->attrFlags & SA_IMM_ATTR_STRONG_DEFAULT) && 
!attr->attrDefaultValue) {
+            LOG_NO("ERR_INVALID_PARAM: Attribute '%s' can not have 
SA_IMM_ATTR_STRONG_DEFAULT flag "
+                    "without having a default value", attNm);
+            illegal = 1;
+        }
+
         if(attr->attrDefaultValue) {
             if(attr->attrFlags & SA_IMM_ATTR_RDN) {
                 LOG_NO("ERR_INVALID_PARAM: RDN '%s' can not have a default", 
attNm);
@@ -3900,6 +3911,7 @@ ImmModel::notCompatibleAtt(const std::st
         bool checkCcb=false;
         bool checkNoDup=false;
         bool checkNoDanglingRefs=false;
+        bool checkStrongDefault=false;
         osafassert(changedAttrs);
         if(oldAttr->mValueType != newAttr->mValueType) {
             LOG_NO("Impossible upgrade, attribute %s:%s changes value type",
@@ -4082,6 +4094,22 @@ ImmModel::notCompatibleAtt(const std::st
                     change = true;
                 }
             }
+
+            if (!(oldAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) &&
+                (newAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT)) {
+                LOG_NO("Allowed upgrade, attribute %s:%s adds flag "
+                    "SA_IMM_ATTR_STRONG_DEFAULT", className.c_str(), 
attName.c_str());
+                checkCcb = true;
+                checkStrongDefault = true;
+                change = true;
+            }
+
+            if ((oldAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) &&
+                !(newAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT)) {
+                LOG_NO("Allowed upgrade, attribute %s:%s removes flag "
+                    "SA_IMM_ATTR_STRONG_DEFAULT", className.c_str(), 
attName.c_str());
+                change = true;
+            }
         }
 
         osafassert(!checkNoDup || checkCcb); //Duplicate-check implies 
ccb-check
@@ -4153,6 +4181,25 @@ ImmModel::notCompatibleAtt(const std::st
                     }
                 }
             }
+
+            if (checkStrongDefault) {
+                /* Screen all instances of the class.
+                 * If there's an instance with the attribute being NULL, abort 
the schema change. */
+                ObjectSet::iterator osi = oldClassInfo->mExtent.begin();
+                for (; osi != oldClassInfo->mExtent.end(); ++osi) {
+                    obj = *osi;
+                    ImmAttrValueMap::iterator oavi = 
obj->mAttrValueMap.find(attName);
+                    osafassert(oavi != obj->mAttrValueMap.end());
+                    if (oavi->second->empty()) {
+                        std::string objName;
+                        getObjectName(obj, objName);
+                        LOG_NO("Impossible upgrade, attribute %s:%s adds 
SA_IMM_ATTR_STRONG_DEFAULT flag, "
+                            "but that attribute of object '%s' has NULL value",
+                            className.c_str(), attName.c_str(), 
objName.c_str());
+                        return true;
+                    }
+                }
+            }
         }
 
         /* "changedAttrs != NULL" ensures that this check is only for the 
schema update */
@@ -4410,7 +4457,8 @@ ImmModel::attrCreate(ClassInfo* classInf
             SA_IMM_ATTR_NOTIFY |
             SA_IMM_ATTR_NO_DANGLING |
             SA_IMM_ATTR_DN |
-            SA_IMM_ATTR_DEFAULT_REMOVED);
+            SA_IMM_ATTR_DEFAULT_REMOVED |
+            SA_IMM_ATTR_STRONG_DEFAULT);
 
         if(unknownFlags) {
             /* This error means that at least one attribute flag is not 
supported by this
@@ -8560,6 +8608,16 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                         err = SA_AIS_ERR_INVALID_PARAM;
                         break; //out of switch
                     }
+
+                    if (attr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+                        osafassert(!attr->mDefaultValue.empty());
+                        (*attrValue) = attr->mDefaultValue;
+
+                        TRACE("Canonicalizing attr-mod for attribute '%s'", 
attrName.c_str());
+                        p->attrValue.attrValuesNumber = 1;
+                        attrValue->copyValueToEdu(&(p->attrValue.attrValue),
+                                                  (SaImmValueTypeT) 
p->attrValue.attrValueType);
+                    }
                     continue; //Ok to replace with nothing.
                 }
                 //else intentional fall-through
@@ -8726,6 +8784,11 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                         err = SA_AIS_ERR_INVALID_PARAM;
                         break; //out of switch
                     }
+
+                    if (attrValue->empty() && (attr->mFlags & 
SA_IMM_ATTR_STRONG_DEFAULT)) {
+                        osafassert(!attr->mDefaultValue.empty());
+                        (*attrValue) = attr->mDefaultValue;
+                    }
                 }
 
                 break; //out of switch
@@ -16102,6 +16165,11 @@ ImmModel::rtObjectUpdate(const ImmsvOmCc
                         attrValue->discardValues();
                     }
                     if(p->attrValue.attrValuesNumber == 0) {
+                        if (attr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+                            osafassert(!attr->mDefaultValue.empty());
+                            (*attrValue) = attr->mDefaultValue;
+                        }
+
                         p = p->next;
                         continue; //Ok to replace with nothing.
                     }
@@ -16225,6 +16293,11 @@ ImmModel::rtObjectUpdate(const ImmsvOmCc
                                 al = al->next;
                             }
                         }
+
+                        if (attrValue->empty() && (attr->mFlags & 
SA_IMM_ATTR_STRONG_DEFAULT)) {
+                            osafassert(!attr->mDefaultValue.empty());
+                            (*attrValue) = attr->mDefaultValue;
+                        }
                     }
                     break; //out of switch
                     
@@ -16977,6 +17050,7 @@ ImmModel::objectSync(const ImmsvOmObject
         } //while(p)
         
         //Check that all attributes with INITIALIZED flag have been set.
+        //Check that all attributes with STRONG_DEFAULT flag have been set.
         ImmAttrValueMap::iterator i6;
         for(i6=object->mAttrValueMap.begin(); 
             i6!=object->mAttrValueMap.end() && err==SA_AIS_OK;
@@ -16994,6 +17068,12 @@ ImmModel::objectSync(const ImmsvOmObject
                     attrName.c_str());
                 err = SA_AIS_ERR_INVALID_PARAM;
             }
+
+            if ((attr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) && 
attrValue->empty()) {
+                LOG_WA("ERR_INVALID_PARAM: attr '%s' has STRONG_DEFAULT flag "
+                    "but has no value", attrName.c_str());
+                err = SA_AIS_ERR_INVALID_PARAM;
+            }
         }
         
         if(err == SA_AIS_OK) {
diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c 
b/osaf/services/saf/immsv/immnd/immnd_evt.c
--- a/osaf/services/saf/immsv/immnd/immnd_evt.c
+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
@@ -3275,6 +3275,18 @@ static SaAisErrorT immnd_fevs_local_chec
                                list = list->next;
                        }
                }
+               if (!immModel_protocol50Allowed(cb)) {
+                       IMMSV_ATTR_DEF_LIST* list = 
frwrd_evt.info.immnd.info.classDescr.attrDefinitions;
+                       while (list) {
+                               if (list->d.attrFlags & 
SA_IMM_ATTR_STRONG_DEFAULT) {
+                                       LOG_WA("ERR_TRY_AGAIN: Can not create 
class with SA_IMM_ATTR_STRONG_DEFAULT "
+                                                       "when proto50 is not 
enabled");
+                                       error = SA_AIS_ERR_TRY_AGAIN;
+                                       break; /* while */
+                               }
+                               list = list->next;
+                       }
+               }
 
                break;
 
diff --git a/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.17.xsd 
b/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.17.xsd
new file mode 100644
--- /dev/null
+++ b/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.17.xsd
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2006 sp1 U (http://www.altova.com) by Maria Toeroe 
(Ericsson Canada/Open Systems Research) -->
+<xs:schema xmlns:imm="http://www.saforum.org/IMMSchema"; 
xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
targetNamespace="http://www.saforum.org/IMMSchema"; 
elementFormDefault="unqualified" attributeFormDefault="unqualified">
+       <!--
+   OWNERSHIP OF SPECIFICATION AND COPYRIGHTS
+
+   Copyright(c) 2009, Service Availability(TM) Forum. All rights reserved.
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose without fee is hereby granted, provided that this entire notice
+   is included in all copies of any software which is or includes a copy
+   or modification of this software and in all copies of the supporting
+   documentation for such software.
+  
+   THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+   WARRANTY.  IN PARTICULAR, THE SERVICE AVAILABILITY FORUM DOES NOT MAKE ANY
+   REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+   OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+
+  -->
+       <!-- PART I - DEFINITION OF AN IMM OBJECT CLASS -->
+       <!--
+       Various types of IMM object attributes (SaImmValueTypeT)
+    -->
+       <xs:simpleType name="attr-value-type">
+               <xs:annotation>
+                       <xs:documentation>Types of attribute's 
values</xs:documentation>
+               </xs:annotation>
+               <xs:restriction base="xs:string">
+                       <xs:enumeration value="SA_INT32_T"/>
+                       <xs:enumeration value="SA_UINT32_T"/>
+                       <xs:enumeration value="SA_INT64_T"/>
+                       <xs:enumeration value="SA_UINT64_T"/>
+                       <xs:enumeration value="SA_NAME_T"/>
+                       <xs:enumeration value="SA_TIME_T"/>
+                       <xs:enumeration value="SA_FLOAT_T"/>
+                       <xs:enumeration value="SA_DOUBLE_T"/>
+                       <xs:enumeration value="SA_STRING_T"/>
+                       <xs:enumeration value="SA_ANY_T"/>
+               </xs:restriction>
+       </xs:simpleType>
+       <!--
+       Two categories of IMM classes & attributes)
+    -->
+       <xs:simpleType name="category">
+               <xs:annotation>
+                       <xs:documentation>Class or attribute 
category</xs:documentation>
+               </xs:annotation>
+               <xs:restriction base="xs:string">
+                       <xs:enumeration value="SA_CONFIG"/>
+                       <xs:enumeration value="SA_RUNTIME"/>
+               </xs:restriction>
+       </xs:simpleType>
+       <!--
+       Flags for object attributes (SaImmAttrFlagsT)
+    -->
+       <xs:simpleType name="attr-flags">
+               <xs:annotation>
+                       <xs:documentation>Attribute flags</xs:documentation>
+               </xs:annotation>
+               <xs:restriction base="xs:string">
+                       <xs:enumeration value="SA_MULTI_VALUE"/>
+                       <xs:enumeration value="SA_WRITABLE"/>
+                       <xs:enumeration value="SA_INITIALIZED"/>
+                       <xs:enumeration value="SA_PERSISTENT"/>
+                       <xs:enumeration value="SA_CACHED"/>
+                       <xs:enumeration value="SA_NO_DUPLICATES"/>
+                       <xs:enumeration value="SA_NOTIFY"/>
+                       <xs:enumeration value="SA_NO_DANGLING"/>
+                       <xs:enumeration value="SA_DN"/>
+                       <xs:enumeration value="SA_DEFAULT_REMOVED"/>
+                       <xs:enumeration value="SA_STRONG_DEFAULT"/>
+               </xs:restriction>
+       </xs:simpleType>
+       <!--
+       Union of types for "value" and "default-value" elements
+    -->
+       <xs:simpleType name="value-type">
+               <xs:annotation>
+                       <xs:documentation>Value type</xs:documentation>
+               </xs:annotation>
+               <xs:union memberTypes="xs:string xs:base64Binary"/>
+       </xs:simpleType>
+       <!-- 
+      Group of XML elements common to RDN and other object attributes
+    -->
+       <xs:group name="attr-elements">
+               <xs:annotation>
+                       <xs:documentation>Common elements to RDN and other 
attributes</xs:documentation>
+               </xs:annotation>
+               <xs:sequence>
+                       <xs:element name="name" type="xs:string"/>
+                       <xs:element name="type" type="imm:attr-value-type"/>
+                       <xs:element name="category" type="imm:category"/>
+                       <xs:element name="flag" type="imm:attr-flags" 
minOccurs="0" maxOccurs="5"/>
+                       <xs:element name="ntfid" type="xs:unsignedInt" 
default="0" minOccurs="0"/>
+               </xs:sequence>
+       </xs:group>
+       <!-- 
+      Definition of an object's RDN attribute 
+    -->
+       <xs:complexType name="rdn-def">
+               <xs:annotation>
+                       <xs:documentation>RDN attribute 
definition</xs:documentation>
+               </xs:annotation>
+               <xs:sequence>
+                       <xs:group ref="imm:attr-elements"/>
+               </xs:sequence>
+       </xs:complexType>
+       <!-- 
+      Definition of an object's attribute (other than RDN)
+      In addition to an RDN attribute, other attributes can be multi-value and 
can have a default value.
+    -->
+       <xs:complexType name="attr-def">
+               <xs:annotation>
+                       <xs:documentation>Attribute 
definition</xs:documentation>
+               </xs:annotation>
+               <xs:sequence>
+                       <xs:group ref="imm:attr-elements"/>
+                       <xs:element name="default-value" type="imm:value-type" 
minOccurs="0"/>
+               </xs:sequence>
+       </xs:complexType>
+       <!-- 
+      Definition of an object class
+    -->
+       <xs:complexType name="class-def">
+               <xs:annotation>
+                       <xs:documentation>Object class 
definition</xs:documentation>
+               </xs:annotation>
+               <xs:sequence>
+                       <xs:element name="category" type="imm:category"/>
+                       <xs:element name="rdn" type="imm:rdn-def"/>
+                       <xs:element name="attr" type="imm:attr-def" 
minOccurs="0" maxOccurs="unbounded"/>
+               </xs:sequence>
+               <xs:attribute name="name" type="xs:string"/>
+       </xs:complexType>
+       <!-- PART II - DEFINITION OF AN IMMS OBJECT INSTANCE -->
+       <!-- 
+      The object is defined by:
+          - its object class
+          - its DN (XML attribute)
+          - all its attributes (name/values)
+    -->
+       <xs:complexType name="object-def">
+               <xs:annotation>
+                       <xs:documentation>Object instance 
definition</xs:documentation>
+               </xs:annotation>
+               <xs:sequence>
+                       <xs:element name="dn" type="xs:string">
+                               <xs:annotation>
+                                       <xs:documentation>Object Distinguished 
Name</xs:documentation>
+                               </xs:annotation>
+                       </xs:element>
+                       <xs:element name="attr" minOccurs="0" 
maxOccurs="unbounded">
+                               <xs:annotation>
+                                       <xs:documentation>Object's 
attributes</xs:documentation>
+                               </xs:annotation>
+                               <xs:complexType>
+                                       <xs:sequence>
+                                               <xs:element name="name" 
type="xs:string"/>
+                                               <xs:element name="value" 
type="imm:value-type" maxOccurs="unbounded"/>
+                                       </xs:sequence>
+                               </xs:complexType>
+                       </xs:element>
+               </xs:sequence>
+               <xs:attribute name="class" type="xs:string"/>
+       </xs:complexType>
+       <!-- PART III- DEFINITION OF IMM Service CONTENTS-->
+       <!-- 
+        The IMM Service contents is defined as a list of class definitions 
followed by a list of objects
+     -->
+       <xs:element name="IMM-contents">
+               <xs:annotation>
+                       <xs:documentation>IMM Service 
contents</xs:documentation>
+               </xs:annotation>
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="class" type="imm:class-def" 
maxOccurs="unbounded"/>
+                               <xs:element name="object" type="imm:object-def" 
minOccurs="0" maxOccurs="unbounded"/>
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+</xs:schema>

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to