internal void AddEntry(int interfaceId, Type iface, int grainTypeCode, string grainInterface, string grainClass, string assembly, PlacementStrategy placement, bool primaryImplementation = false) { lock (this) { GrainInterfaceData grainInterfaceData; if (table.ContainsKey(interfaceId)) { grainInterfaceData = table[interfaceId]; } else { grainInterfaceData = new GrainInterfaceData(interfaceId, iface, grainInterface); table[interfaceId] = grainInterfaceData; if (iface.IsGenericType) { iface = iface.GetGenericTypeDefinition(); } var key = iface.AssemblyQualifiedName; typeToInterfaceData[key] = grainInterfaceData; } var implementation = new GrainClassData(grainTypeCode, grainClass, grainInterfaceData, placement); if (!implementationIndex.ContainsKey(grainTypeCode)) { implementationIndex.Add(grainTypeCode, implementation); } grainInterfaceData.AddImplementation(implementation, primaryImplementation); if (primaryImplementation) { primaryImplementations[grainInterface] = grainClass; } else { if (!primaryImplementations.ContainsKey(grainInterface)) { primaryImplementations.Add(grainInterface, grainClass); } } if (localTestMode) { if (!loadedGrainAsemblies.Contains(assembly)) { loadedGrainAsemblies.Add(assembly); } } } }
public bool TryGetGrainClassData(int grainInterfaceId, out GrainClassData implementation, string grainClassNamePrefix = null) { implementation = null; GrainInterfaceData interfaceData; if (!table.TryGetValue(grainInterfaceId, out interfaceData)) { return(false); } return(TryGetGrainClassData(interfaceData, out implementation, grainClassNamePrefix)); }
internal void AddImplementation(GrainClassData implementation, bool primaryImplemenation = false) { lock (this) { if (!implementations.Contains(implementation)) implementations.Add(implementation); if (primaryImplemenation) PrimaryImplementation = implementation; } }
internal void AddImplementation(GrainClassData implementation, bool primaryImplemenation = false) { lock (this) { if (!implementations.Contains(implementation)) { implementations.Add(implementation); } if (primaryImplemenation) { PrimaryImplementation = implementation; } } }
internal void AddEntry(Type iface, Type grain, PlacementStrategy placement, MultiClusterRegistrationStrategy registrationStrategy, bool primaryImplementation) { lock (this) { var grainTypeInfo = grain.GetTypeInfo(); var grainName = TypeUtils.GetFullName(grainTypeInfo); var isGenericGrainClass = grainTypeInfo.ContainsGenericParameters; var grainTypeCode = GrainInterfaceUtils.GetGrainClassTypeCode(grain); var grainInterfaceData = GetOrAddGrainInterfaceData(iface, isGenericGrainClass); var implementation = new GrainClassData(grainTypeCode, grainName, isGenericGrainClass); if (!implementationIndex.ContainsKey(grainTypeCode)) { implementationIndex.Add(grainTypeCode, implementation); } if (!placementStrategiesIndex.ContainsKey(grainTypeCode)) { placementStrategiesIndex.Add(grainTypeCode, placement); } if (!registrationStrategiesIndex.ContainsKey(grainTypeCode)) { registrationStrategiesIndex.Add(grainTypeCode, registrationStrategy); } grainInterfaceData.AddImplementation(implementation, primaryImplementation); if (primaryImplementation) { primaryImplementations[grainInterfaceData.GrainInterface] = grainName; } else { if (!primaryImplementations.ContainsKey(grainInterfaceData.GrainInterface)) { primaryImplementations.Add(grainInterfaceData.GrainInterface, grainName); } } if (localTestMode) { var assembly = grainTypeInfo.Assembly.CodeBase; if (!loadedGrainAsemblies.Contains(assembly)) { loadedGrainAsemblies.Add(assembly); } } } }
internal void AddEntry(int interfaceId, Type iface, int grainTypeCode, string grainInterface, string grainClass, string assembly, bool isGenericGrainClass, PlacementStrategy placement, MultiClusterRegistrationStrategy registrationStrategy, bool primaryImplementation = false) { lock (this) { GrainInterfaceData grainInterfaceData; if (table.ContainsKey(interfaceId)) { grainInterfaceData = table[interfaceId]; } else { grainInterfaceData = new GrainInterfaceData(interfaceId, iface, grainInterface); table[interfaceId] = grainInterfaceData; var interfaceTypeKey = GetTypeKey(iface, isGenericGrainClass); typeToInterfaceData[interfaceTypeKey] = grainInterfaceData; } var implementation = new GrainClassData(grainTypeCode, grainClass, isGenericGrainClass, grainInterfaceData, placement, registrationStrategy); if (!implementationIndex.ContainsKey(grainTypeCode)) { implementationIndex.Add(grainTypeCode, implementation); } grainInterfaceData.AddImplementation(implementation, primaryImplementation); if (primaryImplementation) { primaryImplementations[grainInterface] = grainClass; } else { if (!primaryImplementations.ContainsKey(grainInterface)) { primaryImplementations.Add(grainInterface, grainClass); } } if (localTestMode) { if (!loadedGrainAsemblies.Contains(assembly)) { loadedGrainAsemblies.Add(assembly); } } } }
public bool TryGetGrainClassData(string grainImplementationClassName, out GrainClassData implementation) { implementation = null; // have to iterate since _primaryImplementations is not serialized. foreach (var interfaceData in table.Values) { foreach (var implClass in interfaceData.Implementations) { if (implClass.GrainClass.Equals(grainImplementationClassName)) { implementation = implClass; return(true); } } } return(false); }
internal void AddEntry(int interfaceId, Type iface, int grainTypeCode, string grainInterface, string grainClass, string assembly, bool isGenericGrainClass, PlacementStrategy placement, bool primaryImplementation = false) { lock (this) { GrainInterfaceData grainInterfaceData; if (table.ContainsKey(interfaceId)) { grainInterfaceData = table[interfaceId]; } else { grainInterfaceData = new GrainInterfaceData(interfaceId, iface, grainInterface); table[interfaceId] = grainInterfaceData; var interfaceTypeKey = GetTypeKey(iface, isGenericGrainClass); typeToInterfaceData[interfaceTypeKey] = grainInterfaceData; } var implementation = new GrainClassData(grainTypeCode, grainClass, isGenericGrainClass, grainInterfaceData, placement); if (!implementationIndex.ContainsKey(grainTypeCode)) implementationIndex.Add(grainTypeCode, implementation); grainInterfaceData.AddImplementation(implementation, primaryImplementation); if (primaryImplementation) { primaryImplementations[grainInterface] = grainClass; } else { if (!primaryImplementations.ContainsKey(grainInterface)) primaryImplementations.Add(grainInterface, grainClass); } if (localTestMode) { if (!loadedGrainAsemblies.Contains(assembly)) loadedGrainAsemblies.Add(assembly); } } }
internal void AddEntry(Type iface, Type grain, PlacementStrategy placement, string directory, bool primaryImplementation) { lock (this) { var grainName = TypeUtils.GetFullName(grain); var isGenericGrainClass = grain.ContainsGenericParameters; var grainTypeCode = GrainInterfaceUtils.GetGrainClassTypeCode(grain); var grainInterfaceData = GetOrAddGrainInterfaceData(iface, isGenericGrainClass); var implementation = new GrainClassData(grainTypeCode, grainName, isGenericGrainClass); if (!implementationIndex.ContainsKey(grainTypeCode)) { implementationIndex.Add(grainTypeCode, implementation); } if (!placementStrategiesIndex.ContainsKey(grainTypeCode)) { placementStrategiesIndex.Add(grainTypeCode, placement); } if (!directoriesIndex.ContainsKey(grainTypeCode)) { directoriesIndex.Add(grainTypeCode, directory); } grainInterfaceData.AddImplementation(implementation, primaryImplementation); if (primaryImplementation) { primaryImplementations[grainInterfaceData.GrainInterface] = grainName; } else { if (!primaryImplementations.ContainsKey(grainInterfaceData.GrainInterface)) { primaryImplementations.Add(grainInterfaceData.GrainInterface, grainName); } } } }
public bool TryGetGrainClassData(Type interfaceType, out GrainClassData implementation, string grainClassNamePrefix) { implementation = null; GrainInterfaceData interfaceData; // First, try to find a non-generic grain implementation: if (this.typeToInterfaceData.TryGetValue(GetTypeKey(interfaceType, false), out interfaceData) && TryGetGrainClassData(interfaceData, out implementation, grainClassNamePrefix)) { return(true); } // If a concrete implementation was not found and the interface is generic, // try to find a generic grain implementation: if (interfaceType.IsGenericType && this.typeToInterfaceData.TryGetValue(GetTypeKey(interfaceType, true), out interfaceData) && TryGetGrainClassData(interfaceData, out implementation, grainClassNamePrefix)) { return(true); } return(false); }
public bool TryGetGrainClassData(Type interfaceType, out GrainClassData implementation, string grainClassNamePrefix) { implementation = null; GrainInterfaceData interfaceData; var typeInfo = interfaceType.GetTypeInfo(); // First, try to find a non-generic grain implementation: if (this.typeToInterfaceData.TryGetValue(GetTypeKey(interfaceType, false), out interfaceData) && TryGetGrainClassData(interfaceData, out implementation, grainClassNamePrefix)) { return true; } // If a concrete implementation was not found and the interface is generic, // try to find a generic grain implementation: if (typeInfo.IsGenericType && this.typeToInterfaceData.TryGetValue(GetTypeKey(interfaceType, true), out interfaceData) && TryGetGrainClassData(interfaceData, out implementation, grainClassNamePrefix)) { return true; } return false; }
private static bool TryGetGrainClassData(GrainInterfaceData interfaceData, out GrainClassData implementation, string grainClassNamePrefix) { implementation = null; var implementations = interfaceData.Implementations; if (implementations.Length == 0) { return(false); } if (String.IsNullOrEmpty(grainClassNamePrefix)) { if (implementations.Length == 1) { implementation = implementations[0]; return(true); } if (interfaceData.PrimaryImplementation != null) { implementation = interfaceData.PrimaryImplementation; return(true); } throw new OrleansException(String.Format("Cannot resolve grain interface ID={0} to a grain class because of multiple implementations of it: {1}", interfaceData.InterfaceId, Utils.EnumerableToString(implementations, d => d.GrainClass, ",", false))); } if (implementations.Length == 1) { if (implementations[0].GrainClass.StartsWith(grainClassNamePrefix, StringComparison.Ordinal)) { implementation = implementations[0]; return(true); } return(false); } var matches = implementations.Where(impl => impl.GrainClass.Equals(grainClassNamePrefix)).ToArray(); //exact match? if (matches.Length == 0) { matches = implementations.Where( impl => impl.GrainClass.StartsWith(grainClassNamePrefix, StringComparison.Ordinal)).ToArray(); //prefix matches } if (matches.Length == 0) { return(false); } if (matches.Length == 1) { implementation = matches[0]; return(true); } throw new OrleansException(String.Format("Cannot resolve grain interface ID={0}, grainClassNamePrefix={1} to a grain class because of multiple implementations of it: {2}", interfaceData.InterfaceId, grainClassNamePrefix, Utils.EnumerableToString(matches, d => d.GrainClass, ",", false))); }
internal static GrainId ComposeGrainId(GrainClassData implementation, Guid primaryKey, Type interfaceType, string keyExt = null) { return GrainId.GetGrainId(implementation.GetTypeCode(interfaceType), primaryKey, keyExt); }
public bool TryGetGrainClassData(string grainImplementationClassName, out GrainClassData implementation) { implementation = null; // have to iterate since _primaryImplementations is not serialized. foreach (var interfaceData in table.Values) { foreach(var implClass in interfaceData.Implementations) if (implClass.GrainClass.Equals(grainImplementationClassName)) { implementation = implClass; return true; } } return false; }
private static bool TryGetGrainClassData(GrainInterfaceData interfaceData, out GrainClassData implementation, string grainClassNamePrefix) { implementation = null; var implementations = interfaceData.Implementations; if (implementations.Length == 0) return false; if (String.IsNullOrEmpty(grainClassNamePrefix)) { if (implementations.Length == 1) { implementation = implementations[0]; return true; } if (interfaceData.PrimaryImplementation != null) { implementation = interfaceData.PrimaryImplementation; return true; } throw new OrleansException(String.Format("Cannot resolve grain interface ID={0} to a grain class because of multiple implementations of it: {1}", interfaceData.InterfaceId, Utils.EnumerableToString(implementations, d => d.GrainClass, ",", false))); } if (implementations.Length == 1) { if (implementations[0].GrainClass.StartsWith(grainClassNamePrefix, StringComparison.Ordinal)) { implementation = implementations[0]; return true; } return false; } var matches = implementations.Where(impl => impl.GrainClass.Equals(grainClassNamePrefix)).ToArray(); //exact match? if (matches.Length == 0) matches = implementations.Where( impl => impl.GrainClass.StartsWith(grainClassNamePrefix, StringComparison.Ordinal)).ToArray(); //prefix matches if (matches.Length == 0) return false; if (matches.Length == 1) { implementation = matches[0]; return true; } throw new OrleansException(String.Format("Cannot resolve grain interface ID={0}, grainClassNamePrefix={1} to a grain class because of multiple implementations of it: {2}", interfaceData.InterfaceId, grainClassNamePrefix, Utils.EnumerableToString(matches, d => d.GrainClass, ",", false))); }
internal static GrainId ComposeGrainId(GrainClassData implementation, Guid primaryKey, Type interfaceType, string keyExt = null) { return(GrainId.GetGrainId(implementation.GetTypeCode(interfaceType), primaryKey, keyExt)); }
internal static GrainId ComposeGrainId(GrainClassData implementation, string primaryKey, Type interfaceType) { return GrainId.GetGrainId(implementation.GetTypeCode(interfaceType), primaryKey); }
internal static GrainId ComposeGrainId(GrainClassData implementation, string primaryKey, Type interfaceType) { return(GrainId.GetGrainId(implementation.GetTypeCode(interfaceType), primaryKey)); }
public bool TryGetGrainClassData(int grainInterfaceId, out GrainClassData implementation, string grainClassNamePrefix = null) { implementation = null; GrainInterfaceData interfaceData; if (!table.TryGetValue(grainInterfaceId, out interfaceData)) { return false; } return TryGetGrainClassData(interfaceData, out implementation, grainClassNamePrefix); }