/// <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)); }