#####################################################################
#####################################################################
## Versavant Topic Map Application Bus / Subject Addressing Engine ##
## Copyright 2005 Steven R. Newcomb                                ##
##                                                                 ##
## This software is licensed under the Apache License, Version 2.0 ##
## (the "License"); you may not use this file except in compliance ##
## with the License.  Copies of the License are available at       ##
##        http://www.apache.org/licenses/LICENSE-2.0               ##
##                                                                 ##
## Unless required by applicable law or agreed to in writing,      ##
## software distributed under the License is distributed on an "AS ##
## IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either ##
## express or implied.  See the License for the specific language  ##
## governing permissions and limitations under the License.        ##
##                                                                 ##
## Copies of the source code and the license are available at      ##
##        http://www.versavant.org                                 ##
#####################################################################
#####################################################################

####################################
cvsRevision = "$Revision: 1.6 $" ##
####################################

import types, sets, re


###########################################
## implementation of "string" value type ##
###########################################

#######################################################
def InstanceOf_string_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( propertyInstance._value)

#######################################################
def XMLContentStringToInstanceOf_string_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_string_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, types.StringType):
        vsv.errMsg( 'The value "%s" is not a string.' % ( propertyValue))
        return True
    return False


###########################################
## implementation of "listOfStrings" value type ##
###########################################

#######################################################
def InstanceOf_listOfStrings_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( propertyInstance._value)

#######################################################
def XMLContentStringToInstanceOf_listOfStrings_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_listOfStrings_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, types.ListType):
        vsv.errMsg( 'The value ("%s") is not a list.' % ( propertyValue))
        return True
    for item in propertyValue:
        if not isinstance( item, types.StringType):
            vsv.errMsg( 'not all of the items in the list which is the value are strings.' % ( propertyValue))
            return True
    return False


###########################################
## implementation of "listOfProps" value type ##
###########################################

#######################################################
def InstanceOf_listOfProps_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def XMLContentStringToInstanceOf_listOfProps_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_listOfProps_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, types.ListType):
        vsv.errMsg( 'The value ("%s") is not a list.' % ( propertyValue))
        return True
    for item in propertyValue:
        if not hasattr( item, 'ObjectClass'):
            vsv.errMsg( 'not all of the items in the list which is the value are propertyInstance objects.' % ( propertyValue))
            return True
        elif item.ObjectClass != 'PropertyInstance':
            vsv.errMsg( 'not all of the items in the list which is the value are propertyInstance objects.' % ( propertyValue))
            return True
    return False


###########################################
## implementation of "setOfStrings" value type ##
###########################################

#######################################################
def InstanceOf_setOfStrings_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)

#######################################################
def XMLContentStringToInstanceOf_setOfStrings_ValueType(vsv, string, propertyClass):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def ValueIsNotOfType_setOfStrings_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, types.DictType):
        vsv.errMsg( 'The value (%s) is not a set (which here is supposed to be a Python dict, not a Python set).' % ( propertyValue))
        return True
    for item in propertyValue:
        if not isinstance( item, types.StringType):
            vsv.errMsg( 'not all of the items in the set which is the value are strings.')
            return True
    return False


###########################################
## implementation of "function" value type ##
###########################################

#######################################################
def InstanceOf_function_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def XMLContentStringToInstanceOf_function_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_function_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if isinstance( propertyValue, types.FunctionType):
        return False
    return 'The value ("%s") is not a function.' % ( propertyValue)

###########################################
## implementation of "dict" value type ##
###########################################

#######################################################
def InstanceOf_dict_ValueTypeToXMLContentString(vsv, propertyInstance):
    propertyValue = propertyInstance._value
    propertyClass = propertyInstance.propertyClass
    topicMap = propertyInstance.topicMap
    if propertyClass.propertyClassName in [ topicMap.opc_system_propertyClasses_TMAName_PCN,
                                            topicMap.opc_system_valueTypes_TMAName_PCN,
                                            topicMap.opc_system_conferralRules_TMAName_PCN]:
        keysOnlyDict = propertyValue.fromkeys( propertyValue, None)  ## as exported, all keys have the value of Pythonic None
        return vsv.cPickleDumpObjectAsXMLContentString( keysOnlyDict)
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export anything

#######################################################
def XMLContentStringToInstanceOf_dict_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_dict_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, types.DictType):
        return True
    return False


###########################################
## implementation of "TMObj" value type ##
###########################################

#######################################################
def InstanceOf_TMObj_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def XMLContentStringToInstanceOf_TMObj_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_TMObj_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, vsv.TopicMap):
        return True
    return False


###########################################
## implementation of "TMAObj" value type ##
###########################################

#######################################################
def InstanceOf_TMAObj_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def XMLContentStringToInstanceOf_TMAObj_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_TMAObj_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, vsv.TMA):
        return True
    return False


###########################################
## implementation of "confRuleObj" value type ##
###########################################

#######################################################
def InstanceOf_confRuleObj_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def XMLContentStringToInstanceOf_confRuleObj_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_confRuleObj_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, vsv.ConferralRule):
        return True
    return False


###########################################
## implementation of "propClassObj" value type ##
###########################################

#######################################################
def InstanceOf_propClassObj_ValueTypeToXMLContentString(vsv, propertyInstance):
    return vsv.cPickleDumpObjectAsXMLContentString( None)  ## don't export this

#######################################################
def XMLContentStringToInstanceOf_propClassObj_ValueType(vsv, string, propertyClass):
    return vsv.cPickleLoadObjectFromXMLContentString( string)

#######################################################
def ValueIsNotOfType_propClassObj_( vsv, propertyValue, propertyClass, propertyInstance = None):
    if not isinstance( propertyValue, vsv.PropertyClass):
        return True
    return False
