/// <summary> /// Returns true if the item has an explicit or implicit dependency on the subject /// </summary> /// <param name="item"></param> /// <param name="subject"></param> /// <returns></returns> internal static bool HasDependency(FeatureDescriptor item, FeatureDescriptor subject) { if (DefaultExtensionTypes.IsTheme(item.Extension.ExtensionType)) { if (DefaultExtensionTypes.IsModule(subject.Extension.ExtensionType)) { // Themes implicitly depend on modules to ensure build and override ordering return true; } if (DefaultExtensionTypes.IsTheme(subject.Extension.ExtensionType)) { // Theme depends on another if it is its base theme return item.Extension.BaseTheme == subject.Id; } } // Return based on explicit dependencies return item.Dependencies != null && item.Dependencies.Any(x => StringComparer.OrdinalIgnoreCase.Equals(x, subject.Id)); }
private Feature LoadFeature(FeatureDescriptor featureDescriptor) { var extensionDescriptor = featureDescriptor.Extension; var featureId = featureDescriptor.Id; var extensionId = extensionDescriptor.Id; ExtensionEntry extensionEntry; try { extensionEntry = BuildEntry(extensionDescriptor); } catch (Exception ex) { Logger.Error(ex, "Error loading extension '{0}'", extensionId); throw new OrchardException(T("Error while loading extension '{0}'.", extensionId), ex); } if (extensionEntry == null) { // If the feature could not be compiled for some reason, // return a "null" feature, i.e. a feature with no exported types. return new Feature { Descriptor = featureDescriptor, ExportedTypes = Enumerable.Empty<Type>() }; } var extensionTypes = extensionEntry.ExportedTypes.Where(t => t.GetTypeInfo().IsClass && !t.GetTypeInfo().IsAbstract); var featureTypes = new List<Type>(); foreach (var type in extensionTypes) { string sourceFeature = GetSourceFeatureNameForType(type, extensionId); if (String.Equals(sourceFeature, featureId, StringComparison.OrdinalIgnoreCase)) { featureTypes.Add(type); } } return new Feature { Descriptor = featureDescriptor, ExportedTypes = featureTypes }; }
private static IEnumerable<FeatureDescriptor> GetFeaturesForExtension(IDictionary<string, string> manifest, ExtensionDescriptor extensionDescriptor) { var featureDescriptors = new List<FeatureDescriptor>(); // Default feature FeatureDescriptor defaultFeature = new FeatureDescriptor { Id = extensionDescriptor.Id, Name = GetValue(manifest, FeatureNameSection) ?? extensionDescriptor.Name, Priority = GetValue(manifest, PrioritySection) != null ? int.Parse(GetValue(manifest, PrioritySection)) : 0, Description = GetValue(manifest, FeatureDescriptionSection) ?? GetValue(manifest, DescriptionSection) ?? string.Empty, Dependencies = ParseFeatureDependenciesEntry(GetValue(manifest, DependenciesSection)), Extension = extensionDescriptor, Category = GetValue(manifest, CategorySection) }; featureDescriptors.Add(defaultFeature); // Remaining features string featuresText = GetValue(manifest, FeaturesSection); if (featuresText != null) { FeatureDescriptor featureDescriptor = null; using (StringReader reader = new StringReader(featuresText)) { string line; while ((line = reader.ReadLine()) != null) { if (IsFeatureDeclaration(line)) { if (featureDescriptor != null) { if (!featureDescriptor.Equals(defaultFeature)) { featureDescriptors.Add(featureDescriptor); } featureDescriptor = null; } string[] featureDeclaration = line.Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries); string featureDescriptorId = featureDeclaration[0].Trim(); if (String.Equals(featureDescriptorId, extensionDescriptor.Id, StringComparison.OrdinalIgnoreCase)) { featureDescriptor = defaultFeature; featureDescriptor.Name = extensionDescriptor.Name; } else { featureDescriptor = new FeatureDescriptor { Id = featureDescriptorId, Extension = extensionDescriptor }; } } else if (IsFeatureFieldDeclaration(line)) { if (featureDescriptor != null) { string[] featureField = line.Split(new[] { ":" }, 2, StringSplitOptions.None); int featureFieldLength = featureField.Length; if (featureFieldLength != 2) continue; for (int i = 0; i < featureFieldLength; i++) { featureField[i] = featureField[i].Trim(); } switch (featureField[0].ToLowerInvariant()) { case NameSection: featureDescriptor.Name = featureField[1]; break; case DescriptionSection: featureDescriptor.Description = featureField[1]; break; case CategorySection: featureDescriptor.Category = featureField[1]; break; case PrioritySection: featureDescriptor.Priority = int.Parse(featureField[1]); break; case DependenciesSection: featureDescriptor.Dependencies = ParseFeatureDependenciesEntry(featureField[1]); break; } } else { string message = string.Format("The line {0} in manifest for extension {1} was ignored", line, extensionDescriptor.Id); throw new ArgumentException(message); } } else { string message = string.Format("The line {0} in manifest for extension {1} was ignored", line, extensionDescriptor.Id); throw new ArgumentException(message); } } if (featureDescriptor != null && !featureDescriptor.Equals(defaultFeature)) featureDescriptors.Add(featureDescriptor); } } return featureDescriptors; }
internal static int GetPriority(FeatureDescriptor featureDescriptor) { return featureDescriptor.Priority; }