/// <summary>
        /// This method gets invoked when the command is called
        /// </summary>
        protected override void InternalProcessRecord()
        {
            SPIisWebServiceApplicationPool resolvedApplicationPool = this.ApplicationPool.Read();

            if (resolvedApplicationPool == null)
            {
                this.ThrowTerminatingError(new InvalidOperationException("Could not find the specified application pool."), ErrorCategory.InvalidOperation, this);
            }

            if (this.ShouldProcess(this.Name))
            {
                // Get or create the service
                ClubCloudService service = ClubCloudService.GetOrCreateService();

                // Get or create the service proxy
                ClubCloudServiceProxy.GetOrCreateServiceProxy();

                // Install the service instances to servers in this farm
                ClubCloudServiceInstance.CreateServiceInstances(service);

                // Create the service application
                ClubCloudServiceApplication application = new ClubCloudServiceApplication(this.Name, service, resolvedApplicationPool);
                application.Update();
                application.Provision();

                // Database settings
                if (string.Equals(this.ParameterSetName, "DB", StringComparison.OrdinalIgnoreCase))
                {
                    NetworkCredential databaseCredentials = null;

                    if (this.DatabaseCredentials != null)
                    {
                        databaseCredentials = (NetworkCredential)this.DatabaseCredentials;
                    }

                    SPDatabaseParameters databaseParameters = SPDatabaseParameters.CreateParameters(this.DatabaseName, this.DatabaseServerName, databaseCredentials, this.DatabaseFailoverServerName, SPDatabaseParameterOptions.None);

                    // Create the database
                    ClubCloudDatabase database = new ClubCloudDatabase(databaseParameters);

                    // Provision the database (runs the Create scripts)
                    database.Provision();

                    // Grant the database the proper permissions
                    database.GrantApplicationPoolAccess(resolvedApplicationPool.ProcessAccount.SecurityIdentifier);

                    // Add the failover server instance (the base class does not do this for you)
                    if (!string.IsNullOrEmpty(this.DatabaseFailoverServerName))
                    {
                        database.AddFailoverServiceInstance(this.DatabaseFailoverServerName);
                    }

                    // Establish a relationship between the service application and the database
                    application.Database = database;
                    application.Update();
                }

                this.WriteObject(application);
            }
        }
        /// <summary>
        /// Click event.
        /// </summary>
        /// <param name="sender">The Sender.</param>
        /// <param name="e">The EventArgs.</param>
        protected void ButtonInstallServiceInstances_Click(object sender, EventArgs e)
        {
            using (SPLongOperation operation = new SPLongOperation(this))
            {
                operation.LeadingHTML  = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstallServiceInstancesOperationLeadingHtml", CultureInfo.CurrentCulture).ToString();
                operation.TrailingHTML = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstallServiceInstancesOperationTrailingHtml", CultureInfo.CurrentCulture).ToString();
                operation.Begin();

                // Get the service
                ClubCloudService service = ClubCloudService.GetOrCreateService();

                // Create the service instances
                ClubCloudServiceInstance.CreateServiceInstances(service);

                operation.End("/_admin/ClubCloud.Service/ManageService.aspx");
            }
        }
        /// <summary>
        /// Click event.
        /// </summary>
        /// <param name="sender">The Sender.</param>
        /// <param name="e">The EventArgs.</param>
        protected void ButtonInstallService_Click(object sender, EventArgs e)
        {
            using (SPLongOperation operation = new SPLongOperation(this))
            {
                operation.LeadingHTML  = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstallOperationLeadingHtml", CultureInfo.CurrentCulture).ToString();
                operation.TrailingHTML = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstallOperationTrailingHtml", CultureInfo.CurrentCulture).ToString();
                operation.Begin();

                // Install the service
                ClubCloudService service = ClubCloudService.GetOrCreateService();

                // Install the service instances but do not start (provision) them (let the admin do this on the services on server screen).
                ClubCloudServiceInstance.CreateServiceInstances(service);

                // Install the service proxy
                ClubCloudServiceProxy.GetOrCreateServiceProxy();

                operation.End("/_admin/ClubCloud.Service/ManageService.aspx");
            }
        }
        /// <summary>
        /// Page_Load event.
        /// </summary>
        /// <param name="sender">The Sender.</param>
        /// <param name="e">The EventArgs.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                // Populate the controls with default values
                ClubCloudService      service = SPFarm.Local.Services.GetValue <ClubCloudService>();
                ClubCloudServiceProxy proxy   = SPFarm.Local.ServiceProxies.GetValue <ClubCloudServiceProxy>();

                if (service != null)
                {
                    this.literalServiceStatus.Text    = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceStatusLabelInstalled", CultureInfo.CurrentCulture).ToString();
                    this.imageServiceStatus.ImageUrl  = "/_admin/ClubCloud.Service/ServiceInstalled.gif";
                    this.buttonInstallService.Visible = false;
                    this.buttonRemoveService.Visible  = true;

                    this.serviceInstanceStatusSection.Visible    = true;
                    this.serviceApplicationStatusSection.Visible = true;
                }
                else
                {
                    this.literalServiceStatus.Text             = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceStatusLabelNotInstalled", CultureInfo.CurrentCulture).ToString();
                    this.imageServiceStatus.ImageUrl           = "/_admin/ClubCloud.Service/ServiceNotInstalled.gif";
                    this.buttonInstallService.Visible          = true;
                    this.buttonRemoveService.Visible           = false;
                    this.buttonInstallServiceInstances.Visible = false;

                    this.serviceInstanceStatusSection.Visible    = false;
                    this.serviceApplicationStatusSection.Visible = false;
                }

                if (proxy != null)
                {
                    this.imageServiceProxyStatus.ImageUrl = "/_admin/ClubCloud.Service/ServiceInstalled.gif";
                    this.literalServiceProxyStatus.Text   = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceStatusLabelInstalled", CultureInfo.CurrentCulture).ToString();
                }
                else
                {
                    this.imageServiceProxyStatus.ImageUrl = "/_admin/ClubCloud.Service/ServiceNotInstalled.gif";
                    this.literalServiceProxyStatus.Text   = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceStatusLabelNotInstalled", CultureInfo.CurrentCulture).ToString();
                }

                // Check if the service instances have been provisioned, and show their status
                List <ServiceInstanceStatus> serviceInstances = new List <ServiceInstanceStatus>();

                foreach (SPServer server in SPFarm.Local.Servers)
                {
                    if (server.Role == SPServerRole.Application || server.Role == SPServerRole.SingleServer || server.Role == SPServerRole.WebFrontEnd)
                    {
                        ServiceInstanceStatus serviceInstance = new ServiceInstanceStatus();
                        serviceInstance.ServerName = server.Name;
                        serviceInstance.ServerId   = HttpUtility.UrlEncode(server.Id.ToString());
                        serviceInstances.Add(serviceInstance);

                        ClubCloudServiceInstance instance = server.ServiceInstances.GetValue <ClubCloudServiceInstance>();
                        if (instance == null)
                        {
                            serviceInstance.ServerStatus      = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstanceStatusNotInstalled", CultureInfo.CurrentCulture).ToString();
                            serviceInstance.IsInstalled       = false;
                            serviceInstance.ServerStatusImage = "/_admin/ClubCloud.Service/HLTHFAIL.PNG";
                        }
                        else if (instance.Status == SPObjectStatus.Online)
                        {
                            serviceInstance.ServerStatus      = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstanceStatusStarted", CultureInfo.CurrentCulture).ToString();
                            serviceInstance.IsInstalled       = true;
                            serviceInstance.ServerStatusImage = "/_admin/ClubCloud.Service/HLTHSUCC.PNG";
                        }
                        else
                        {
                            serviceInstance.ServerStatus      = HttpContext.GetGlobalResourceObject("ClubCloud.Service.ServiceAdminResources", "ManageServiceInstanceStatusStopped", CultureInfo.CurrentCulture).ToString();
                            serviceInstance.IsInstalled       = true;
                            serviceInstance.ServerStatusImage = "/_admin/ClubCloud.Service/HLTHERR.PNG";
                        }
                    }
                }

                this.gridViewInstanceStatus.DataSource = serviceInstances;
                this.gridViewInstanceStatus.DataBind();

                if (service != null)
                {
                    this.gridViewApplicationStatus.DataSource = service.Applications;
                    this.gridViewApplicationStatus.DataBind();
                }
            }
        }