private static VisualizationObjectAttribute GetVisualizationObjectAttribute(Type visualizationObjectType, VisualizationLogWriter logWriter) { VisualizationObjectAttribute visualizationObjectAttribute = visualizationObjectType.GetCustomAttribute <VisualizationObjectAttribute>(); if (visualizationObjectAttribute == null) { logWriter.WriteError("Visualization object {0} could not be loaded because it is not decorated with a VisualizationObjectAttribute", visualizationObjectType.Name); return(null); } if (string.IsNullOrWhiteSpace(visualizationObjectAttribute.CommandText)) { logWriter.WriteError("Visualization object {0} could not be loaded because its VisualizationObjectAttribute does not specify a Text property", visualizationObjectType.Name); return(null); } if (string.IsNullOrWhiteSpace(visualizationObjectAttribute.IconSourcePath) && string.IsNullOrWhiteSpace(visualizationObjectAttribute.NewPanelIconSourcePath)) { logWriter.WriteError("Visualization object {0} could not be loaded because its VisualizationObjectAttribute does not specify either an IconSourcePath property or a NewPanelIconSourcePath property", visualizationObjectType.Name); return(null); } if (!visualizationObjectAttribute.VisualizationFormatString.Contains(VisualizationObjectAttribute.DefaultVisualizationFormatString)) { logWriter.WriteError("Visualization object {0} could not be loaded because its VisualizationObjectAttribute has an invalid value for the VisualizationFormatString property", visualizationObjectType.Name); return(null); } return(visualizationObjectAttribute); }
private static void Create( List <VisualizerMetadata> metadatas, Type dataType, Type visualizationObjectType, VisualizationObjectAttribute visualizationObjectAttribute, VisualizationPanelTypeAttribute visualizationPanelTypeAttribute, StreamAdapterMetadata adapterMetadata) {
private static void Create( List <VisualizerMetadata> metadatas, Type dataType, Type visualizationObjectType, VisualizationObjectAttribute visualizationObjectAttribute, VisualizationPanelTypeAttribute visualizationPanelTypeAttribute, StreamAdapterMetadata adapterMetadata) { var commandTitle = (visualizationObjectAttribute.IsUniversalVisualizer || adapterMetadata == null) ? $"Visualize {visualizationObjectAttribute.CommandText}" : $"Visualize as {visualizationObjectAttribute.CommandText}"; metadatas.Add(new VisualizerMetadata( dataType, visualizationObjectType, adapterMetadata?.AdapterType, visualizationObjectAttribute.SummarizerType, commandTitle, visualizationObjectAttribute.IconSourcePath, visualizationPanelTypeAttribute.VisualizationPanelType, visualizationObjectAttribute.VisualizationFormatString, false, visualizationObjectAttribute.IsUniversalVisualizer)); var inNewPanelCommandTitle = (visualizationObjectAttribute.IsUniversalVisualizer || adapterMetadata == null) ? $"Visualize {visualizationObjectAttribute.CommandText} in New Panel" : $"Visualize as {visualizationObjectAttribute.CommandText} in New Panel"; metadatas.Add(new VisualizerMetadata( dataType, visualizationObjectType, adapterMetadata?.AdapterType, visualizationObjectAttribute.SummarizerType, inNewPanelCommandTitle, visualizationObjectAttribute.NewPanelIconSourcePath, visualizationPanelTypeAttribute.VisualizationPanelType, visualizationObjectAttribute.VisualizationFormatString, true, visualizationObjectAttribute.IsUniversalVisualizer)); }
private static void Create(List <VisualizerMetadata> metadatas, Type dataType, Type visualizationObjectType, VisualizationObjectAttribute visualizationObjectAttribute, VisualizationPanelTypeAttribute visualizationPanelTypeAttribute, StreamAdapterMetadata adapterMetadata) { // Create the metadata for the "visualize" menu command if required if (!string.IsNullOrWhiteSpace(visualizationObjectAttribute.IconSourcePath)) { metadatas.Add(new VisualizerMetadata(dataType, visualizationObjectType, adapterMetadata?.AdapterType, visualizationObjectAttribute.SummarizerType, visualizationObjectAttribute.CommandText, visualizationObjectAttribute.IconSourcePath, visualizationPanelTypeAttribute.VisualizationPanelType, visualizationObjectAttribute.VisualizationFormatString, false, visualizationObjectAttribute.IsBelowSeparator)); } // Create the metadata for the "visualize in new panel" menu command if required if (!string.IsNullOrWhiteSpace(visualizationObjectAttribute.NewPanelIconSourcePath)) { metadatas.Add(new VisualizerMetadata(dataType, visualizationObjectType, adapterMetadata?.AdapterType, visualizationObjectAttribute.SummarizerType, visualizationObjectAttribute.CommandText + " in New Panel", visualizationObjectAttribute.NewPanelIconSourcePath, visualizationPanelTypeAttribute.VisualizationPanelType, visualizationObjectAttribute.VisualizationFormatString, true, visualizationObjectAttribute.IsBelowSeparator)); } }
/// <summary> /// Creates one or two visualizer metadatas depending on whether a "Visualize in new panel" icon source path was suplied by the visualization object. /// </summary> /// <param name="visualizationObjectType">The visualization object type.</param> /// <param name="summarizers">The list of known summarizers.</param> /// <param name="dataAdapters">The list of known data adapters.</param> /// <param name="logWriter">The log writer where errors should be written to.</param> /// <returns>A list of visualizer metadatas.</returns> public static List <VisualizerMetadata> Create(Type visualizationObjectType, Dictionary <Type, SummarizerMetadata> summarizers, List <StreamAdapterMetadata> dataAdapters, VisualizationLogWriter logWriter) { // Get the visualization object attribute VisualizationObjectAttribute visualizationObjectAttribute = GetVisualizationObjectAttribute(visualizationObjectType, logWriter); if (visualizationObjectAttribute == null) { return(null); } // Get the visualization panel type attribute VisualizationPanelTypeAttribute visualizationPanelTypeAttribute = GetVisualizationPanelTypeAttribute(visualizationObjectType, logWriter); if (visualizationPanelTypeAttribute == null) { return(null); } // Get the message data type for the visualization object. We will get nothing back // if visualizationObjectType does not ultimately derive from VisualizationObject<TData> Type visualizationObjectDataType = GetVisualizationObjectDataType(visualizationObjectType, logWriter); if (visualizationObjectDataType == null) { return(null); } // Get the summarizer type (if the visualizer uses a summarizer) SummarizerMetadata summarizerMetadata = null; if (visualizationObjectAttribute.SummarizerType != null) { if (summarizers.ContainsKey(visualizationObjectAttribute.SummarizerType)) { summarizerMetadata = summarizers[visualizationObjectAttribute.SummarizerType]; } else { logWriter.WriteError("Unable to load visualizer {0} because it relies on summarizer {1} which could not be found.", visualizationObjectType.Name, visualizationObjectAttribute.SummarizerType.Name); return(null); } } // If we have a summarizer, make sure its output type matches the input type of the visualization object if ((summarizerMetadata != null) && (summarizerMetadata.OutputType != visualizationObjectDataType)) { logWriter.WriteError( "Unable to load visualizer {0} with summarizer {1} because the output type of the summarizer ({2}) does not match the input type of the visualizer ({3}) .", visualizationObjectType.Name, summarizerMetadata.SummarizerType.Name, summarizerMetadata.OutputType.Name, visualizationObjectDataType.Name); return(null); } // Work out the input (message) data type: // // 1) If there's a summarizer, use the summarizer's input type // 2) Otherwise, use the visualization object's data type Type dataType = summarizerMetadata != null ? summarizerMetadata.InputType : visualizationObjectDataType; List <VisualizerMetadata> metadatas = new List <VisualizerMetadata>(); // Add the visualization metadata using no adapter Create(metadatas, dataType, visualizationObjectType, visualizationObjectAttribute, visualizationPanelTypeAttribute, null); // Find all the adapters that have an output type that's the same as the visualization object's data type (or summarizer input type) List <StreamAdapterMetadata> usableAdapters = dataAdapters.FindAll(a => dataType == a.OutputType || dataType.IsSubclassOf(a.OutputType)); // Add the visualization metadata using each of the compatible adapters foreach (StreamAdapterMetadata adapterMetadata in usableAdapters) { Create(metadatas, adapterMetadata.InputType, visualizationObjectType, visualizationObjectAttribute, visualizationPanelTypeAttribute, adapterMetadata); } return(metadatas); }