public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
        {
            if (!Enabled)
            {
                return(pInMsg);
            }
            string errorMessage;

            if (!Validate(out errorMessage))
            {
                throw new ArgumentException(errorMessage);
            }
            var contentReader = new ContentReader();

            var       data          = pInMsg.BodyPart.GetOriginalDataStream();
            const int bufferSize    = 0x280;
            const int thresholdSize = 0x100000;

            if (!data.CanSeek || !data.CanRead)
            {
                data = new ReadOnlySeekableStream(data, new VirtualStream(bufferSize, thresholdSize), bufferSize);
                pContext.ResourceTracker.AddResource(data);
            }
            if (contentReader.IsXmlContent(data))
            {
                var    encoding   = contentReader.Encoding(data);
                string nodeFormat = ShowPropertyInfoAsNodes ?
                                    "<property><name>{0}</name><namespace>{1}</namespace><promoted>{2}</promoted><value>{3}</value></property>"
                    : "<property name=\"{0}\" namespace=\"{1}\" promoted=\"{2}\">{3}</property>";
                string msgctx = "", propName, propNS;
                object retval;
                if (string.IsNullOrEmpty(SelectedProperties))
                {
                    for (int i = 0; i < pInMsg.Context.CountProperties; i++)
                    {
                        retval  = pInMsg.Context.ReadAt(i, out propName, out propNS);
                        msgctx += string.Format(nodeFormat, propName, propNS, pInMsg.Context.IsPromoted(propName, propNS), retval);
                    }
                }
                else
                {
                    var selectedProps = SelectedProperties.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                    for (int i = 0; i < selectedProps.Length; i++)
                    {
                        var property = new ContextProperty(selectedProps[i]);
                        retval = pInMsg.Context.Read(property);
                        if (retval != null)
                        {
                            msgctx += string.Format(nodeFormat, property.PropertyName, property.PropertyNamespace, pInMsg.Context.IsPromoted(property), retval);
                        }
                    }
                }
                msgctx = "<messagecontext>" + msgctx + "</messagecontext>";

                data = new CommentInjector(data, msgctx, encoding);
                data = new ReadOnlySeekableStream(data, new VirtualStream(bufferSize, thresholdSize), bufferSize);
                pContext.ResourceTracker.AddResource(data);
                pInMsg.BodyPart.Data = data;
            }
            else
            {
                data.Seek(0, SeekOrigin.Begin);
                pInMsg.BodyPart.Data = data;
            }
            return(pInMsg);
        }