From 771aea7b80a24c285e984704fea15aeef6d58686 Mon Sep 17 00:00:00 2001
From: Nathan Reller <Nathan.Reller@jhuapl.edu>
Date: Fri, 19 Feb 2016 11:50:08 -0500
Subject: [PATCH] Added Class Type to Managed Object

SQLAlchemy requires a unique identifier for classes when using the
join table inheritence strategy. Previous commits were reusing the
object_type attribute of ManagedObject, but this strategy does not
work for classes that are subclasses of an object. This will be the
case for the Certificate object type because one such subclass will be
X509Certificate.
---
 kmip/pie/objects.py | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/kmip/pie/objects.py b/kmip/pie/objects.py
index ff4f0e4..4fe1d0a 100644
--- a/kmip/pie/objects.py
+++ b/kmip/pie/objects.py
@@ -14,7 +14,7 @@
 # under the License.
 
 from abc import abstractmethod
-from sqlalchemy import Column, event, ForeignKey, Integer, VARBINARY
+from sqlalchemy import Column, event, ForeignKey, Integer, String, VARBINARY
 from sqlalchemy.ext.associationproxy import association_proxy
 from sqlalchemy.orm import relationship
 
@@ -46,6 +46,7 @@ class ManagedObject(sql.Base):
     __tablename__ = 'managed_objects'
     unique_identifier = Column('uid', Integer, primary_key=True)
     _object_type = Column('object_type', sql.EnumType(enums.ObjectType))
+    _class_type = Column('class_type', String(50))
     value = Column('value', VARBINARY(1024))
     name_index = Column(Integer, default=0)
     _names = relationship('ManagedObjectName', back_populates='mo',
@@ -53,8 +54,8 @@ class ManagedObject(sql.Base):
     names = association_proxy('_names', 'name')
 
     __mapper_args__ = {
-        'polymorphic_identity': 0x00000000,
-        'polymorphic_on': _object_type
+        'polymorphic_identity': 'ManagedObject',
+        'polymorphic_on': _class_type
     }
 
     @abstractmethod
@@ -149,7 +150,7 @@ class CryptographicObject(ManagedObject):
     cryptographic_usage_masks = Column('cryptographic_usage_mask',
                                        sql.UsageMaskType)
     __mapper_args__ = {
-        'polymorphic_identity': 0x80000001
+        'polymorphic_identity': 'CryptographicObject'
     }
 
     @abstractmethod
@@ -209,7 +210,7 @@ class Key(CryptographicObject):
         'key_format_type', sql.EnumType(enums.KeyFormatType))
 
     __mapper_args__ = {
-        'polymorphic_identity': 0x80000002
+        'polymorphic_identity': 'Key'
     }
 
     @abstractmethod
@@ -256,7 +257,7 @@ class SymmetricKey(Key):
                                primary_key=True)
 
     __mapper_args__ = {
-        'polymorphic_identity': enums.ObjectType.SYMMETRIC_KEY
+        'polymorphic_identity': 'SymmetricKey'
     }
 
     def __init__(self, algorithm, length, value, masks=None,
@@ -394,7 +395,7 @@ class PublicKey(Key):
                                primary_key=True)
 
     __mapper_args__ = {
-        'polymorphic_identity': enums.ObjectType.PUBLIC_KEY
+        'polymorphic_identity': 'PublicKey'
     }
 
     def __init__(self, algorithm, length, value,
@@ -545,7 +546,7 @@ class PrivateKey(Key):
                                primary_key=True)
 
     __mapper_args__ = {
-        'polymorphic_identity': enums.ObjectType.PRIVATE_KEY
+        'polymorphic_identity': 'PrivateKey'
     }
 
     def __init__(self, algorithm, length, value, format_type, masks=None,
@@ -839,7 +840,7 @@ class SecretData(CryptographicObject):
                                primary_key=True)
     data_type = Column('data_type', sql.EnumType(enums.SecretDataType))
     __mapper_args__ = {
-        'polymorphic_identity': enums.ObjectType.SECRET_DATA
+        'polymorphic_identity': 'SecretData'
     }
 
     def __init__(self, value, data_type, masks=None, name='Secret Data'):
@@ -952,7 +953,7 @@ class OpaqueObject(ManagedObject):
                                primary_key=True)
     opaque_type = Column('opaque_type', sql.EnumType(enums.OpaqueDataType))
     __mapper_args__ = {
-        'polymorphic_identity': enums.ObjectType.OPAQUE_DATA
+        'polymorphic_identity': 'OpaqueData'
     }
 
     def __init__(self, value, opaque_type, name='Opaque Object'):