Example #1
0
        /// <summary>
        /// Finds the application object by known maps.
        /// </summary>
        /// <param name="objectSpace">The object space.</param>
        /// <param name="reference">The reference.</param>
        /// <returns>Application object</returns>
        private static object findApplicationObjectByKnownMaps(IObjectSpace objectSpace, IObjectReference reference)
        {
            object result = null;

            // search using known mappings
            if (reference is IPackageObjectReference)
            {
                var objRef = (IPackageObjectReference)reference;
                if (!string.IsNullOrEmpty(objRef.KnownMapping))
                {
                    var typeInfo = objectSpace.TypesInfo.FindTypeInfo(objRef.ClassName);
                    if (typeInfo != null)
                    {
                        foreach (var mappingString in objRef.KnownMapping.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries))
                        {
                            var mapValues = mappingString.Split('\a');
                            if (mapValues.Length < 2)
                            {
                                continue;
                            }

                            var refNodeId = mapValues[0];

                            if (refNodeId == XafDeltaModule.Instance.CurrentNodeId)
                            {
                                // direct search by TargetId in current database
                                result = objectSpace.GetObjectByKey(typeInfo.Type,
                                                                    XPWeakReference.StringToKey(mapValues[1]));
                            }
                            else
                            {
                                // search similar mapping in existing OidMaps and return its target
                                var searchCriteria =
                                    CriteriaOperator.Parse("NodeId = ? And AssemblyName = ? And ClassName = ? And ObjectId = ?",
                                                           refNodeId, reference.AssemblyName, reference.ClassName, mapValues[1]);
                                var knownMap = objectSpace.FindObject <OidMap>(searchCriteria, true);
                                if (knownMap != null)
                                {
                                    result = knownMap.TargetObject;
                                }
                            }

                            if (result != null)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            return(result);
        }
 public override object ConvertFromStorageType(object value)
 {
     return(XPWeakReference.StringToKey((string)value));
 }