コード例 #1
0
        public override void Execute()
        {
            DTE     dte     = (DTE)this.GetService(typeof(DTE));
            Project Project = this.GetTargetProject(dte);

            string evaluatedTemplateFileName  = EvaluateParameterAsString(dte, TemplateFileName);
            string evaluatedParentFeatureName = EvaluateParameterAsString(dte, ParentFeatureName);
            string evaluatedAssemblyName      = EvaluateParameterAsString(dte, AssemblyName);
            string evaluatedNamespace         = EvaluateParameterAsString(dte, Namespace);

            string xmlContent = GenerateContent(evaluatedTemplateFileName, "ReceiverCode.xml");

            try
            {
                //feature name consists of application name + SPSFConstants.NameSeparator + featurename, but we need to strip off the feature name from that
                string appName     = Helpers.GetSaveApplicationName(dte);
                string featureName = evaluatedParentFeatureName;
                if (featureName.StartsWith(appName, StringComparison.InvariantCultureIgnoreCase))
                {
                    featureName = featureName.Substring(appName.Length + 1);
                }

                string FeatureReceiverClass = featureName + "EventReceiver";

                if (Helpers2.IsSharePointVSTemplate(dte, Project))
                {
                    //can we cast the project to ISharePointSolution
                    ISharePointProjectService projectService    = Helpers2.GetSharePointProjectService(Project.DTE);
                    ISharePointProject        sharePointProject = projectService.Convert <EnvDTE.Project, ISharePointProject>(Project);
                    sharePointProject.Synchronize();

                    ISharePointProjectFeature parentfeature = null;
                    foreach (ISharePointProjectFeature feature in sharePointProject.Features)
                    {
                        if (feature.Name == evaluatedParentFeatureName)
                        {
                            parentfeature = feature;
                        }
                    }

                    if (parentfeature != null)
                    {
                        if (string.IsNullOrEmpty(parentfeature.Model.ReceiverClass))
                        {
                            if (dte.SuppressUI || (MessageBox.Show("Feature '" + evaluatedParentFeatureName + "' contains no feature receiver. Add feature receiver?", "Add Feature Receiver?", MessageBoxButtons.YesNo) == DialogResult.Yes))
                            {
                                ProjectItem projectItem    = projectService.Convert <ISharePointProjectFeature, EnvDTE.ProjectItem>(parentfeature);
                                ProjectItem featureXmlFile = projectService.Convert <ISharePointProjectMember, EnvDTE.ProjectItem>(parentfeature.FeatureFile);

                                //no feature receiver there, we create one
                                ProjectItem createdFeatureReceiverItem = CreateNewFeatureReceiver(featureName, projectItem, featureXmlFile);
                                parentfeature.Model.ReceiverAssembly = evaluatedAssemblyName;
                                parentfeature.Model.ReceiverClass    = evaluatedNamespace + "." + FeatureReceiverClass;
                                this.MergeNewCodeWithClass(createdFeatureReceiverItem, FeatureReceiverClass, xmlContent);
                                sharePointProject.Synchronize();

                                //is test run save file
                                if (dte.SuppressUI)
                                {
                                    featureXmlFile.Save();
                                    //createdFeatureReceiverItem.Save();
                                }
                            }
                            else
                            {
                                return;
                            }
                        }
                        else
                        {
                            //1. we check if there is a filename with .generated in it
                            //we need the class name of the featurereceiver, but in VS-Feature the name contains a ID
                            string className = parentfeature.Model.ReceiverClass;
                            if (className.StartsWith("$SharePoint.Type"))
                            {
                                //not supported???
                                if (parentfeature.EventReceiverFile != null)
                                {
                                    ProjectItem existingCode = projectService.Convert <ISharePointProjectMember, EnvDTE.ProjectItem>(parentfeature.EventReceiverFile);
                                    this.MergeNewCodeWithClass(existingCode, "", xmlContent);
                                }
                            }
                            else
                            {
                                string foundReceiverClassName = parentfeature.Model.ReceiverClass;

                                string receiverNamespace = foundReceiverClassName.Substring(0, foundReceiverClassName.LastIndexOf(".") - 1);
                                string receiverClassName = foundReceiverClassName.Substring(foundReceiverClassName.LastIndexOf(".") + 1);

                                //ok, class name found
                                //yes, there is a feature receiver, but we need to find the class in the project
                                //find any .cs item which contains the name of the featureclass and namespace
                                List <string> patterns = new List <string>();
                                patterns.Add(receiverNamespace);
                                patterns.Add(receiverClassName);
                                patterns.Add(" FeatureActivated(");  //to ensure that we get the correct partial class
                                ProjectItem existingCode = Helpers.FindItem(Project, ".cs", patterns);

                                if (existingCode != null)
                                {
                                    this.MergeNewCodeWithClass(existingCode, receiverClassName, xmlContent);
                                }
                            }
                        }
                    }
                }
                else
                {
                    //find the feature receiver code
                    ProjectItem featureXMLFile = Helpers.GetFeatureXML(Project, evaluatedParentFeatureName);
                    ProjectItem featureFolder  = Helpers2.GetFeature(Project.DTE, Project, evaluatedParentFeatureName);

                    //check if feature already contains feature receiver
                    if (featureXMLFile != null)
                    {
                        string receiverClassName = Helpers.GetFeatureReceiverClass(featureXMLFile);
                        string receiverNamespace = Helpers.GetFeatureReceiverNamespace(featureXMLFile);

                        if (receiverClassName == "")
                        {
                            if (dte.SuppressUI || (MessageBox.Show("Feature '" + evaluatedParentFeatureName + "' contains no feature receiver. Add feature receiver?", "Add Feature Receiver?", MessageBoxButtons.YesNo) == DialogResult.Yes))
                            {
                                //there is no feature receiver, we need to create one :-(
                                string path = Helpers.GetFullPathOfProjectItem(featureXMLFile);

                                XmlDocument doc = new XmlDocument();
                                doc.Load(path);
                                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                                nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/sharepoint/");

                                XmlNode node = doc.SelectSingleNode("/ns:Feature", nsmgr);
                                if (node != null)
                                {
                                    ProjectItem createdFeatureReceiverItem = CreateNewFeatureReceiver(featureName, featureFolder, featureXMLFile);

                                    XmlAttribute receiverAssemblyAttrib = doc.CreateAttribute("ReceiverAssembly");
                                    receiverAssemblyAttrib.Value = evaluatedAssemblyName;
                                    node.Attributes.Append(receiverAssemblyAttrib);

                                    XmlAttribute receiverClassAttrib = doc.CreateAttribute("ReceiverClass");
                                    receiverClassAttrib.Value = evaluatedNamespace + "." + FeatureReceiverClass;
                                    node.Attributes.Append(receiverClassAttrib);

                                    Helpers.EnsureCheckout(dte, path);

                                    XmlWriter xw = XmlWriter.Create(path, Helpers.GetXmlWriterSettings(path));
                                    doc.Save(xw);
                                    xw.Flush();
                                    xw.Close();

                                    this.MergeNewCodeWithClass(createdFeatureReceiverItem, FeatureReceiverClass, xmlContent);
                                }
                            }
                            else
                            {
                                return;
                            }
                        }
                        else
                        {
                            //yes, there is a feature receiver, but we need to find the class in the project
                            //find any .cs item which contains the name of the featureclass and namespace
                            List <string> patterns = new List <string>();
                            patterns.Add(receiverClassName);
                            patterns.Add(receiverNamespace);
                            patterns.Add(" FeatureActivated(");  //to ensure that we get the correct partial class
                            ProjectItem existingCode = Helpers.FindItem(Project, ".cs", patterns);

                            if (existingCode != null)
                            {
                                //find the activated Function
                                string featureFilename = Helpers.GetFullPathOfProjectItem(existingCode);
                                this.MergeNewCodeWithClass(existingCode, receiverClassName, xmlContent);
                            }
                        }
                    }

                    if (featureXMLFile != null)
                    {
                        CreatedProjectItem = featureXMLFile;
                    }
                    else
                    {
                        CreatedProjectItem = Helpers.GetFeatureXML(Project, evaluatedParentFeatureName);
                    }

                    if (featureFolder != null)
                    {
                        CreatedProjectFolder = featureFolder;
                    }
                    else
                    {
                        CreatedProjectFolder = Helpers2.GetFeature(Project.DTE, Project, evaluatedParentFeatureName);
                    }
                }
            }
            catch (Exception ex)
            {
                if (dte.SuppressUI)
                {
                    throw new Exception(ex.ToString());
                }
                else
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }