예제 #1
0
        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);
        }
예제 #2
0
 private static void Create(
     List <VisualizerMetadata> metadatas,
     Type dataType,
     Type visualizationObjectType,
     VisualizationObjectAttribute visualizationObjectAttribute,
     VisualizationPanelTypeAttribute visualizationPanelTypeAttribute,
     StreamAdapterMetadata adapterMetadata)
 {
예제 #3
0
        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));
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        /// <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);
        }