Src/Presentation.cs

using System;
using System.IO;
using System.Xml;
using System.Globalization;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Management.Automation;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Presentation;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Configuration.IO;
using System.Text.RegularExpressions;
 
namespace SMLets
{
    public class PresentationCmdletBase : SMCmdletBase
    {
        private string[] _name = { "*" };
        [Parameter(Position = 0)]
        public string[] Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
 
    #region SCSMView cmdlets
 
    [Cmdlet(VerbsCommon.New, "SCSMView")]
    public class NewSMViewCommand : ObjectCmdletHelper
    {
        #region parameters
 
        private ManagementPackFolder _Folder = null;
        private String _DisplayName = null;
        private String _Criteria = null;
        private ManagementPackClass _Class = null;
        private ManagementPack _ManagementPack = null;
        private SwitchParameter _PassThru;
        private ManagementPackTypeProjection _Projection;
        private Column[] _columns;
        private ManagementPackImage _image;
        private KeyValuePair<string, ManagementPackReference>[] _ManagementPackReferences;
 
        [Parameter(Position = 0,
        Mandatory = true,
        ValueFromPipelineByPropertyName = true,
        HelpMessage = "The folder of the view.")]
 
        public ManagementPackFolder Folder
        {
            get { return _Folder; }
            set { _Folder = value; }
        }
 
        [Parameter(Position = 1,
        Mandatory = false,
        ValueFromPipelineByPropertyName = true,
        HelpMessage = "The display name of the view.")]
 
        public String DisplayName
        {
            get { return _DisplayName; }
            set { _DisplayName = value; }
        }
 
        [Parameter(Position = 2,
        Mandatory = false,
        ValueFromPipelineByPropertyName = true,
        HelpMessage = "The target class of the view.")]
 
        public ManagementPackClass Class
        {
            get { return _Class; }
            set { _Class = value; }
        }
 
 
        [Parameter(Position = 3,
        Mandatory = false,
        ValueFromPipelineByPropertyName = true,
        HelpMessage = "The management pack to store the view in.")]
 
        public ManagementPack ManagementPack
        {
            get { return _ManagementPack; }
            set { _ManagementPack = value; }
        }
 
        [Parameter(Position = 4,
        Mandatory = true,
        ValueFromPipelineByPropertyName = true,
        HelpMessage = "The view criteria.")]
 
        public String Criteria
        {
            get { return _Criteria; }
            set { _Criteria = value; }
        }
 
        [Parameter(Position = 5,
        Mandatory = false,
        ValueFromPipelineByPropertyName = false,
        HelpMessage = "The columns to show.")]
 
        public Column[] Columns
        {
            get { return _columns; }
            set { _columns = value; }
        }
 
        [Parameter(Position = 6,
        Mandatory = false,
        ValueFromPipeline = false,
        HelpMessage = "The tree image for the view")]
        public ManagementPackImage Image
        {
            get { return _image; }
            set { _image = value; }
        }
 
        [Parameter(Position = 7,
        Mandatory = false,
        ValueFromPipeline = false,
        HelpMessage = "The management pack references to add to be used in the criteria XML")]
        public KeyValuePair<string,ManagementPackReference>[] ManagementPackReference
        {
            get { return _ManagementPackReferences; }
            set { _ManagementPackReferences = value; }
        }
 
        [Parameter(Position = 8,
        Mandatory = false,
        ValueFromPipeline = false,
        HelpMessage = "The type projection to be used.")]
 
        public ManagementPackTypeProjection Projection
        {
            get { return _Projection; }
            set { _Projection = value; }
        }
 
        [Parameter]
        public SwitchParameter PassThru
        {
            get { return _PassThru; }
            set { _PassThru = value; }
        }
 
        #endregion
 
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
        }
 
        protected override void ProcessRecord()
        {
            try
            {
                base.ProcessRecord();
 
                ManagementPackView view = new ManagementPackView(ManagementPack, SMHelpers.MakeMPElementSafeUniqueIdentifier("View"), ManagementPackAccessibility.Internal);
                view.DisplayName = _DisplayName; //Set the display name according to what the user specified
                view.Target = _Class; //Set the class according to what the user specified
 
                //TODO: Parameterize these later
                view.Visible = true;
                view.Accessibility = ManagementPackAccessibility.Public;
                view.Enabled = true;
                view.Category = "NotUsed";
 
                //Set the parent folder that was passed in
                ManagementPackFolderItem folderitem = new ManagementPackFolderItem(view, _Folder);
 
                //Add the management pack references to the MP
                if(_ManagementPackReferences != null)
                {
                    foreach (KeyValuePair<string,ManagementPackReference> kvp in _ManagementPackReferences)
                    {
                        _ManagementPack.References.Add(kvp);
                    }
                }
 
                //Get the Grid view type and set it for the view
                ManagementPack mpConsole = SMHelpers.GetManagementPack(ManagementPacks.Microsoft_EnterpriseManagement_ServiceManager_UI_Console, _mg);
                view.TypeID = mpConsole.GetViewType("GridViewType");
 
                #region DataAdapters
 
                DataAdapter daEMO = new DataAdapter();
                DataAdapter daAdvancedList = new DataAdapter();
 
                if (_Projection != null)
                {
                    daEMO.Name = "dataportal:EnterpriseManagementObjectAdapter";
                    daEMO.Type = "Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectProjectionAdapter";
                }
                else
                {
                    daEMO.Name = "dataportal:EnterpriseManagementObjectProjectionAdapter";
                    daEMO.Type = "Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter";
                }
 
                daEMO.Assembly = "Microsoft.EnterpriseManagement.UI.SdkDataAccess";
 
                daAdvancedList.Name = "viewframework://Adapters/AdvancedList";
                daAdvancedList.Assembly = "Microsoft.EnterpriseManagement.UI.ViewFramework";
                daAdvancedList.Type = "Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter";
 
                Collection<DataAdapter> collDataAdpaters = new Collection<DataAdapter>();
                collDataAdpaters.Add(daEMO);
                collDataAdpaters.Add(daAdvancedList);
 
                #endregion DataAdapters
 
                view.Configuration = CreateViewConfiguration(collDataAdpaters, _columns);
 
                foreach (Column column in _columns)
                {
                    ManagementPackStringResource mpsr = new ManagementPackStringResource(view.GetManagementPack(), column.DisplayNameId);
                    mpsr.DisplayName = column.DisplayNameString;
                }
 
                //Set the image
                if (_image != null)
                {
                    ManagementPackElementReference<ManagementPackImage> viewIconReference = (ManagementPackElementReference<ManagementPackImage>)_mg.Resources.GetResource<ManagementPackImage>(_image.Name,_image.GetManagementPack());
                    ManagementPackImageReference imageref = new ManagementPackImageReference(view, viewIconReference, view.GetManagementPack());
                }
 
                view.GetManagementPack().AcceptChanges();
 
                if (PassThru)
                {
                    //Pass the new object to the pipeline
                    WriteObject(view);
                }
            }
            catch (Exception ex)
            {
                WriteError(new ErrorRecord(ex, "NewView", ErrorCategory.InvalidOperation, DisplayName));
            }
        }
 
        protected override void EndProcessing()
        {
            base.EndProcessing();
        }
 
        private string CreateViewConfiguration(Collection<DataAdapter> collDataAdapters, Column[] collColumns)
        {
            XmlDocument xmldoc = new XmlDocument();
            XmlElement elConfiguration = xmldoc.CreateElement("Configuration");
            xmldoc.AppendChild(elConfiguration);
 
            CreateDataXmlNode(ref xmldoc, collDataAdapters);
 
            CreatePresentationXmlNode(ref xmldoc, collColumns);
 
            StringWriter sw = new StringWriter();
            XmlTextWriter tw = new XmlTextWriter(sw);
 
            xmldoc.WriteTo(tw);
 
            string strConfiguration = sw.ToString();
 
            //Strip off the dummy document element.
            strConfiguration = strConfiguration.Replace("<Configuration>", "");
            strConfiguration = strConfiguration.Replace("</Configuration>", "");
 
            return (strConfiguration);
        }
 
        private void CreateDataXmlNode(ref XmlDocument xmldoc, Collection<DataAdapter> collDataAdapters)
        {
            XmlElement elData = xmldoc.CreateElement("Data");
            xmldoc.DocumentElement.AppendChild(elData); //Add as child of "Configuration" document element for now.
            XmlElement elAdapters = xmldoc.CreateElement("Adapters");
 
            foreach (DataAdapter da in collDataAdapters)
            {
                XmlElement xmlnodeDataAdapter = CreateDataAdapterNode(ref xmldoc, da);
                elAdapters.AppendChild(xmlnodeDataAdapter);
            }
 
            elData.AppendChild(elAdapters);
 
            XmlElement elItemsSource = xmldoc.CreateElement("ItemsSource");
            XmlElement elAdvancedListSupportClass = xmldoc.CreateElement("AdvancedListSupportClass");
 
            //AdvancedListSupportClass attributes
            XmlAttribute attrXmlnsALSC = xmldoc.CreateAttribute("xmlns");
            XmlAttribute attrXmlnsAvALSC = xmldoc.CreateAttribute("xmlns:av");
            XmlAttribute attrXmlnsXALSC = xmldoc.CreateAttribute("xmlns:x");
            XmlAttribute attrXmlnsSALSC = xmldoc.CreateAttribute("xmlns:s");
            XmlAttribute attrDataTypeName = xmldoc.CreateAttribute("DataTypeName");
            XmlAttribute attrAdapterName = xmldoc.CreateAttribute("AdapterName");
            XmlAttribute attrFullUpdateAdapter = xmldoc.CreateAttribute("FullUpdateAdapter");
            XmlAttribute attrDataSource = xmldoc.CreateAttribute("DataSource");
            XmlAttribute attrFullUpdateFrequency = xmldoc.CreateAttribute("FullUpdateFrequency");
            XmlAttribute attrStreaming = xmldoc.CreateAttribute("Streaming");
            XmlAttribute attrIsRecurring = xmldoc.CreateAttribute("IsRecurring");
            XmlAttribute attrRecurrenceFrequency = xmldoc.CreateAttribute("RecurrenceFrequency");
 
            //TODO: Parameterize these someday
            attrXmlnsALSC.Value = "clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework";
            attrXmlnsAvALSC.Value = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
            attrXmlnsXALSC.Value = "http://schemas.microsoft.com/winfx/2006/xaml";
            attrXmlnsSALSC.Value = "clr-namespace:System;assembly=mscorlib";
            attrDataTypeName.Value = "";
            attrAdapterName.Value = "viewframework://Adapters/AdvancedList";
            attrDataSource.Value = "mom:ManagementGroup";
            attrFullUpdateFrequency.Value = "1";
            attrStreaming.Value = "true";
            attrIsRecurring.Value = "true";
            attrRecurrenceFrequency.Value = "{x:Static s:Int32.MaxValue}";
            if(_Projection != null)
                attrFullUpdateAdapter.Value = "dataportal:EnterpriseManagementObjectProjectionAdapter";
            else
                attrFullUpdateAdapter.Value = "dataportal:EnterpriseManagementObjectAdapter";
 
            elAdvancedListSupportClass.Attributes.Append(attrXmlnsALSC);
            elAdvancedListSupportClass.Attributes.Append(attrXmlnsAvALSC);
            elAdvancedListSupportClass.Attributes.Append(attrXmlnsSALSC);
            elAdvancedListSupportClass.Attributes.Append(attrXmlnsXALSC);
            elAdvancedListSupportClass.Attributes.Append(attrDataTypeName);
            elAdvancedListSupportClass.Attributes.Append(attrAdapterName);
            elAdvancedListSupportClass.Attributes.Append(attrFullUpdateAdapter);
            elAdvancedListSupportClass.Attributes.Append(attrDataSource);
            elAdvancedListSupportClass.Attributes.Append(attrFullUpdateFrequency);
            elAdvancedListSupportClass.Attributes.Append(attrStreaming);
            elAdvancedListSupportClass.Attributes.Append(attrIsRecurring);
            elAdvancedListSupportClass.Attributes.Append(attrRecurrenceFrequency);
 
            XmlElement elAdvancedListSupportClassParameters = xmldoc.CreateElement("AdvancedListSupportClass.Parameters");
 
            XmlElement elQueryParameter = xmldoc.CreateElement("QueryParameter");
 
            XmlAttribute attrParameter = xmldoc.CreateAttribute("Parameter");
            XmlAttribute attrValue = xmldoc.CreateAttribute("Value");
 
            ManagementPackElement element;
 
            if (_Projection != null)
            {
                attrParameter.Value = "TypeProjectionId";
                element = _Projection;
            }
            else
            {
                attrParameter.Value = "ManagementPackClassId";
                element = _Class;
            }
 
            ManagementPack elementMP = element.GetManagementPack();
             
            string strMPAlias = string.Empty;
 
            if (elementMP != _ManagementPack)
            {
                //If the class/type projection is not in the same management pack as where we are creating the view then try to either use an existing MP reference or create a new one
                foreach (KeyValuePair<string,ManagementPackReference> mpref in _ManagementPack.References)
                {
                    if (mpref.Value.Id == elementMP.Id)
                    {
                        //Found an existing reference so just use that alias
                        strMPAlias = mpref.Key;
                        break;
                    }
                }
                 
                if (strMPAlias == string.Empty)
                {
                    //We didnt find the MP reference in the set of existing references, let's create one..
                    strMPAlias = elementMP.Name.Replace(".", "_");
                    ManagementPackReference mpref = new ManagementPackReference(elementMP);
                    _ManagementPack.References.Add(strMPAlias, mpref);
                }
            }
 
            if(strMPAlias == string.Empty)
                attrValue.Value = String.Format("$MPElement[Name='{0}']$", element.Name);
            else
                attrValue.Value = String.Format("$MPElement[Name='{0}!{1}']$", strMPAlias, element.Name);
 
            elQueryParameter.Attributes.Append(attrParameter);
            elQueryParameter.Attributes.Append(attrValue);
 
            elAdvancedListSupportClassParameters.AppendChild(elQueryParameter);
 
            elAdvancedListSupportClass.AppendChild(elAdvancedListSupportClassParameters);
 
            elItemsSource.AppendChild(elAdvancedListSupportClass);
 
            elData.AppendChild(elItemsSource);
 
            XmlDocumentFragment fragCriteria = xmldoc.CreateDocumentFragment();
            fragCriteria.InnerXml = _Criteria;
 
            elData.AppendChild(fragCriteria);
        }
 
        private void CreatePresentationXmlNode(ref XmlDocument xmldoc, Column[] collColumns)
        {
            XmlElement elPresentation = xmldoc.CreateElement("Presentation");
            xmldoc.DocumentElement.AppendChild(elPresentation); //Add as child of "Configuration" document element for now.
            XmlElement elColumns = xmldoc.CreateElement("Columns");
            XmlElement elViewStrings = xmldoc.CreateElement("ViewStrings");
 
            XmlElement elColumnCollection = xmldoc.CreateElement("mux", "ColumnCollection", "http://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView");
 
            XmlAttribute attrXmlnsCC = xmldoc.CreateAttribute("xmlns");
            attrXmlnsCC.Value = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
             
            XmlAttribute attrXmlnsSCC = xmldoc.CreateAttribute("xmlns:s");
            attrXmlnsSCC.Value = "clr-namespace:System;assembly=mscorlib";
             
            XmlAttribute attrXmlnsXCC = xmldoc.CreateAttribute("xmlns:x");
            attrXmlnsXCC.Value = "http://schemas.microsoft.com/winfx/2006/xaml";
             
            XmlAttribute attrXmlnsDataCC = xmldoc.CreateAttribute("xmlns:data");
            attrXmlnsDataCC.Value = "clr-namespace:Microsoft.EnterpriseManagement.UI.SdkDataAccess.Common;assembly=Microsoft.EnterpriseManagement.UI.SdkDataAccess";
 
            elColumnCollection.Attributes.Append(attrXmlnsCC);
            elColumnCollection.Attributes.Append(attrXmlnsSCC);
            elColumnCollection.Attributes.Append(attrXmlnsXCC);
            elColumnCollection.Attributes.Append(attrXmlnsDataCC);
 
            foreach (Column column in collColumns)
            {
                XmlElement elColumn = CreateColumnNode(ref xmldoc, column);
                elColumnCollection.AppendChild(elColumn);
 
                XmlElement elViewString = CreateViewStringNode(ref xmldoc, column);
                elViewStrings.AppendChild(elViewString);
            }
 
            elColumns.AppendChild(elColumnCollection);
            elPresentation.AppendChild(elColumns);
 
            elPresentation.AppendChild(elViewStrings);
        }
 
        private XmlElement CreateDataAdapterNode(ref XmlDocument xmldoc, DataAdapter da)
        {
 
            XmlElement elAdapter = xmldoc.CreateElement("Adapter");
 
            XmlAttribute attrAdapterName = xmldoc.CreateAttribute("AdapterName");
            attrAdapterName.Value = da.Name;
            elAdapter.Attributes.Append(attrAdapterName);
 
            XmlElement elAdapterAssembly = xmldoc.CreateElement("AdapterAssembly");
            elAdapterAssembly.InnerText = da.Assembly;
 
            XmlElement elAdapterType = xmldoc.CreateElement("AdapterType");
            elAdapterType.InnerText = da.Type;
 
            elAdapter.AppendChild(elAdapterAssembly);
            elAdapter.AppendChild(elAdapterType);
 
            return (elAdapter);
        }
 
        private XmlElement CreateColumnNode(ref XmlDocument xmldoc, Column column)
        {
            XmlElement elColumn = xmldoc.CreateElement("mux","Column","http://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView");
 
            XmlAttribute attrName = xmldoc.CreateAttribute("Name");
            XmlAttribute attrDisplayMemberBinding = xmldoc.CreateAttribute("DisplayMemberBinding");
            XmlAttribute attrWidth = xmldoc.CreateAttribute("Width");
            XmlAttribute attrDisplayNameId = xmldoc.CreateAttribute("DisplayName");
            XmlAttribute attrProperty = xmldoc.CreateAttribute("Property");
            XmlAttribute attrDataType = xmldoc.CreateAttribute("DataType");
 
            attrName.Value = column.Name;
            attrDisplayMemberBinding.Value = column.DisplayMemberBinding;
            attrWidth.Value = column.Width;
            attrDisplayNameId.Value = column.DisplayNameId;
            attrProperty.Value = column.Property;
            attrDataType.Value = column.DataType;
 
            elColumn.Attributes.Append(attrName);
            elColumn.Attributes.Append(attrDisplayMemberBinding);
            elColumn.Attributes.Append(attrWidth);
            elColumn.Attributes.Append(attrDisplayNameId);
            elColumn.Attributes.Append(attrProperty);
            elColumn.Attributes.Append(attrDataType);
 
            return (elColumn);
        }
 
        private XmlElement CreateViewStringNode(ref XmlDocument xmldoc, Column column)
        {
            XmlElement elViewString = xmldoc.CreateElement("ViewString");
            XmlAttribute attrId = xmldoc.CreateAttribute("ID");
            attrId.Value = column.DisplayNameId;
            elViewString.Attributes.Append(attrId);
            elViewString.InnerText = "$MPElement[Name=\"" + column.DisplayNameId + "\"]$";
            return (elViewString);
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMView")]
    public class GetSCSMViewCommand : PresentationCmdletBase
    {
        private IList<ManagementPackView> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetViews();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant|WildcardOptions.IgnoreCase);
                foreach (ManagementPackView v in list)
                {
                    if (pattern.IsMatch(v.Name))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Remove, "SCSMView", SupportsShouldProcess = true)]
    public class RemoveSCSMView : PresentationCmdletBase
    {
        private ManagementPackView _view;
 
        [Parameter(Mandatory = true, ValueFromPipeline = true)]
        public ManagementPackView View
        {
            get { return _view; }
            set { _view = value; }
        }
 
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
 
            ManagementPackView view = _mg.Presentation.GetView(_view.Id);
            ManagementPack mp = view.GetManagementPack();
            view.Status = ManagementPackElementStatus.PendingDelete;
            string viewInfo = view.Name;
            if(view.DisplayName != null)
            {
                viewInfo = view.DisplayName;
            }
 
            if(ShouldProcess(viewInfo))
            {
                mp.AcceptChanges();
            }
        }
    }
 
    #endregion
 
    #region SCSMFolder cmdlets
 
    [Cmdlet(VerbsCommon.Get, "SCSMFolder")]
    public class GetSCSMFolderCommand : PresentationCmdletBase
    {
        private IList<ManagementPackFolder> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetFolders();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ManagementPackFolder v in list)
                {
                    if (pattern.IsMatch(v.Name))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.New, "SCSMFolder")]
    public class NewSMFolderCommand : ObjectCmdletHelper
    {
        private string _displayname;
        ManagementPackFolder _parentfolder;
        ManagementPack _managementpack;
        //TODO: Add support for this someday
        //ManagementPackImage _image;
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public string DisplayName
        {
            get { return _displayname; }
            set { _displayname = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public ManagementPackFolder ParentFolder
        {
            get { return _parentfolder; }
            set { _parentfolder = value; }
        }
 
        [Parameter(ValueFromPipeline = false, Mandatory = true)]
        public ManagementPack ManagementPack
        {
            get { return _managementpack; }
            set { _managementpack = value; }
        }
 
        //TODO: Add support for this at some point
        /*
        [Parameter(ValueFromPipeline = false, Mandatory = false)]
        public ManagementPackImage Image
        {
            get { return _image; }
            set { _image = value; }
        }
        */
 
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
 
            //Create a new folder and set it's parent folder and display name
            ManagementPackFolder folder = new ManagementPackFolder(_managementpack, SMHelpers.MakeMPElementSafeUniqueIdentifier("Folder"), ManagementPackAccessibility.Public);
            folder.DisplayName = _displayname;
            folder.ParentFolder = _parentfolder;
 
            //TODO: Parameterize this someday
            //Set the systemfolder icon to be the icon that is used
            ManagementPackElementReference<ManagementPackImage> foldericonreference = (ManagementPackElementReference<ManagementPackImage>)_mg.Resources.GetResource<ManagementPackImage>(Images.Microsoft_EnterpriseManagement_ServiceManager_UI_Console_Image_Folder, SMHelpers.GetManagementPack(ManagementPacks.Microsoft_EnterpriseManagement_ServiceManager_UI_Console, _mg));
            ManagementPackImageReference image = new ManagementPackImageReference(folder, foldericonreference, _managementpack);
 
            //Submit changes
            _managementpack.AcceptChanges();
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMFolderHierarchy",DefaultParameterSetName="HIERARCHY")]
    public class GetSCSMFolderHierarchyCommand : ObjectCmdletHelper
    {
        private ManagementPackFolder[] _folder;
        [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ParameterSetName="HIERARCHY")]
        public ManagementPackFolder[] Folder
        {
            get { return _folder; }
            set { _folder = value; }
        }
        private SwitchParameter _root;
        [Parameter(Mandatory = true, ParameterSetName = "ROOT")]
        public SwitchParameter Root
        {
            get { return _root; }
            set { _root = value; }
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            if (ParameterSetName == "ROOT")
            {
                foreach (ManagementPackFolder f in _mg.Presentation.GetFolders())
                {
                    if (f.ParentFolder == null)
                    {
                        WriteObject(_mg.Presentation.GetFolderHierarchy(f.Id));
                    }
                }
            }
            else
            {
                foreach (ManagementPackFolder f in Folder)
                {
                    WriteObject(_mg.Presentation.GetFolderHierarchy(f.Id));
                }
            }
        }
    }
 
    #endregion
 
    [Cmdlet(VerbsCommon.Get, "SCSMStringResource")]
    public class GetSCSMStringResourceCommand : PresentationCmdletBase
    {
        private List<ManagementPackStringResource> l;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            l = new List<ManagementPackStringResource>();
            foreach (ManagementPack mp in _mg.ManagementPacks.GetManagementPacks())
            {
                foreach (ManagementPackStringResource r in mp.GetStringResources())
                {
                    l.Add(r);
                }
            }
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            foreach (string n in Name)
            {
                WildcardPattern wp = new WildcardPattern(n, WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant);
                foreach (ManagementPackStringResource r in l)
                {
                    if (wp.IsMatch(r.Name))
                    {
                        WriteObject(r);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMLanguagePackCulture")]
    public class GetSCSMLanguagePackCommand : SMCmdletBase
    {
        List<string> cultures;
        CultureInfo[] systemCultures;
        IList<ManagementPackLanguagePack> lpList;
        protected override void BeginProcessing()
        {
            WriteVerbose("BeginProcessing Begin");
            base.BeginProcessing();
            cultures = new List<string>();
            systemCultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
            lpList = _mg.LanguagePacks.GetLanguagePacks();
            WriteVerbose("BeginProcessing End");
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            WriteVerbose("ProcessRecord");
            foreach (ManagementPackLanguagePack lp in lpList)
            {
                foreach (CultureInfo ci in systemCultures)
                {
                    if (String.Compare(ci.ThreeLetterWindowsLanguageName, lp.Name, true) == 0 && !cultures.Contains(lp.Name))
                    {
                        WriteObject(ci);
                        cultures.Add(lp.Name);
                        break;
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMForm")]
    public class GetSCSMFormCommand : PresentationCmdletBase
    {
        private IList<ManagementPackForm> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetForms();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ManagementPackForm v in list)
                {
                    if (pattern.IsMatch(v.Name))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMPage")]
    public class GetSCSMPageCommand : PresentationCmdletBase
    {
        private IList<ManagementPackUIPage> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetPages();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ManagementPackUIPage v in list)
                {
                    if (pattern.IsMatch(v.Name))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
     
    [Cmdlet(VerbsCommon.Get, "SCSMPageSet")]
    public class GetSCSMPageSetCommand : PresentationCmdletBase
    {
        private IList<ManagementPackUIPageSet> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetPageSets();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ManagementPackUIPageSet v in list)
                {
                    if (pattern.IsMatch(v.Name))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMViewSetting")]
    public class GetSCSMViewSettingCommand : PresentationCmdletBase
    {
        private IList<ViewSetting> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetViewSettings();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ViewSetting v in list)
                {
                    if (pattern.IsMatch(v.ViewId.ToString()))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMViewType")]
    public class GetSCSMViewTypeCommand : PresentationCmdletBase
    {
        private IList<ManagementPackViewType> list;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Presentation.GetViewTypes();
        }
        protected override void ProcessRecord()
        {
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ManagementPackViewType v in list)
                {
                    if (pattern.IsMatch(v.Name))
                    {
                        WriteObject(v);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMImage")]
    public class GetSCSMImageCommand : PresentationCmdletBase
    {
 
        private SwitchParameter _listOnly;
        [Parameter]
        public SwitchParameter ListOnly
        {
            get { return _listOnly; }
            set { _listOnly = value; }
        }
  
        private IList<ManagementPackImage> list;
        private string _currentDirectory;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            list = _mg.Resources.GetResources<ManagementPackImage>();
            _currentDirectory = SessionState.Path.CurrentFileSystemLocation.Path;
            if (ListOnly)
            {
                foreach (string p in Name)
                {
                    WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                    foreach (ManagementPackImage i in list)
                    {
                        if (pattern.IsMatch(i.FileName) && !i.HasNullStream)
                        {
                            WriteObject(i);
                        }
                    }
                }
            }
        }
        protected override void ProcessRecord()
        {
            if (ListOnly)
            {
                return;
            }
            foreach (string p in Name)
            {
                WildcardPattern pattern = new WildcardPattern(p, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                foreach (ManagementPackImage v in list)
                {
                    if (pattern.IsMatch(v.FileName) && ! v.HasNullStream)
                    {
                        if (ShouldProcess(v.FileName))
                        {
                            try
                            {
                                string outputFile = String.Format("{0}\\{1}", _currentDirectory, v.FileName);
                                WriteVerbose("output filename: " + outputFile);
                                Stream s = _mg.Resources.GetResourceData(v.Id);
                                byte[] b = new byte[s.Length];
                                s.Read(b, 0, (int)s.Length);
                                s.Close();
                                s.Dispose();
                                FileStream fs = new FileStream(outputFile, FileMode.Create);
                                fs.Write(b, 0, b.Length);
                                fs.Close();
                                fs.Dispose();
                                WriteObject(SessionState.InvokeCommand.InvokeScript("Get-ChildItem " + outputFile));
                            }
                            catch (Exception e)
                            {
                                WriteError(new ErrorRecord(e, "Save Image", ErrorCategory.InvalidOperation, v));
                            }
                        }
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMConsoleTask")]
    public class GetSCSMConsoleTaskCommand : PresentationCmdletBase
    {
        private IList<ManagementPackConsoleTask> consoleTaskList;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            consoleTaskList = _mg.TaskConfiguration.GetConsoleTasks();
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            foreach (ManagementPackConsoleTask task in consoleTaskList)
            {
                foreach (string n in Name)
                {
                    WildcardPattern wp = new WildcardPattern(n, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                    if (wp.IsMatch(task.Name))
                    {
                        WriteObject(task);
                        break;
                    }
                }
            }
        }
 
    }
 
    [Cmdlet(VerbsCommon.New, "SCSMColumn")]
    public class NewSCSMColum : SMCmdletBase
    {
        private string _name;
        private string _displayname;
        private string _width = "100";
        private string _bindingpath;
        private string _datatype = "s:String";
        private SwitchParameter _PassThru = false;
 
        [Parameter(Mandatory = true)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
 
        [Parameter(Mandatory = true)]
        public string BindingPath
        {
            get { return _bindingpath; }
            set { _bindingpath = value; }
        }
 
        [Parameter(Mandatory = false)]
        public string DisplayName
        {
            get { return _displayname; }
            set { _displayname = value; }
        }
         
        [Parameter]
        public string Width
        {
            get { return _width; }
            set { _width = value; }
        }
 
        [Parameter]
        public string DataType
        {
            get { return _datatype; }
            set { _datatype = value; }
        }
 
        [Parameter]
        public SwitchParameter PassThru
        {
            get { return _PassThru; }
            set { _PassThru = value; }
        }
 
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
        }
 
        protected override void EndProcessing()
        {
             base.EndProcessing();
 
            Column columnOutput = new Column();
            columnOutput.DataType = _datatype;
            columnOutput.DisplayMemberBinding = String.Format("{{Binding Path={0}}}", _bindingpath);
            columnOutput.DisplayNameId = SMHelpers.MakeMPElementSafeUniqueIdentifier(_displayname);
            columnOutput.DisplayNameString = _displayname;
            if (_name != null)
                columnOutput.Name = _name;
            else
                columnOutput.Name = SMHelpers.MakeMPElementSafeUniqueIdentifier("Column");
            columnOutput.Property = _bindingpath;
            columnOutput.Width = _width;
 
            if (PassThru)
            {
                WriteObject(columnOutput);
            }
        }
    }
}