Ejemplo n.º 1
0
        /// <summary>
        /// Updates an existing organizational unit to the given values.
        /// </summary>
        /// <param name="updatedUnit">The updated unit.</param>
        /// <returns>MethodResult indicating success.</returns>
        public MethodResult UpdateOrganizationalUnit(OrganizationalUnit updatedUnit)
        {
            var adapter = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>();

            if (updatedUnit.IsPrincipalUnit)
            {
                var current = adapter.GetOrganizationalUnitById(updatedUnit.Id);
                if (current.AdminMailAddress != updatedUnit.AdminMailAddress)
                {
                    var user       = adapter.GetUserByMailAddress(current.AdminMailAddress);
                    var tempResult = new UserController().ChangeMailAddress(user, updatedUnit.AdminMailAddress);
                    if (!tempResult.IsSucceeded())
                    {
                        return(tempResult);
                    }

                    tempResult = new UserController().ResetPassword(updatedUnit.AdminMailAddress);
                    if (!tempResult.IsSucceeded())
                    {
                        return(tempResult);
                    }
                }

                if (current.Name == updatedUnit.Name)
                {
                    return(new MethodResult());
                }
            }

            return(adapter.RenameOrganizationalUnit(updatedUnit.Id, updatedUnit.Name));
        }
        /// <summary>
        /// Changes the users mail address.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="newUserMail">The new mail address.</param>
        /// <returns>MethodResult indicating success.</returns>
        public MethodResult ChangeMailAddress(User user, string newUserMail)
        {
            if (string.IsNullOrWhiteSpace(newUserMail) || (newUserMail.Contains("@") == false))
            {
                throw new InvalidDataException("Invalid mail address.");
            }

            var oldMail = user.MailAddress;
            var result  = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>().ChangeMailAddress(user, newUserMail);

            if (result.IsSucceeded())
            {
                string newPasswordAppender = null;
                if (user.MustChangePassword)
                {
                    var innerResult = InnerResetPassword(newUserMail);
                    if (innerResult.IsSucceeded())
                    {
                        newPasswordAppender =
                            string.Format(ClipperTexts.NewlyGeneratedPasswordOnMailReset, innerResult.Result);
                    }
                }

                QuerySendMailAsync(user, ClipperTexts.MailChangedMailSubject, ClipperTexts.MailChangedMailBody + newPasswordAppender);
                QuerySendMailAsync(new Notifiable(oldMail, user.UserName), ClipperTexts.MailChangedMailSubject, ClipperTexts.MailChangedMailBody);
            }

            return(result);
        }
        private void textBoxInputFileName_TextChanged(object sender, EventArgs e)
        {
            string filename = textBoxInputFileName.Text.Trim();

            if (File.Exists(filename))
            {
                //Create input database adapter
                tp.InputDatabase          = DatabaseAdapterFactory.CreateReader(Path.GetExtension(filename), CheckBoxEditMode.Checked);
                tp.InputDatabase.FileName = filename;

                textBoxInputFileName.ForeColor = System.Drawing.SystemColors.WindowText;
                //Fill tables list
                comboBoxTableName.Items.Clear();

                comboBoxTableName.Items.AddRange(tp.InputDatabase.GetTables());
                if (comboBoxTableName.Items.Count == 1)
                {
                    comboBoxTableName.SelectedIndex = 0;
                }
                else
                {
                    comboBoxTableName.Text = "";
                }
            }
            else
            {
                textBoxInputFileName.ForeColor = Color.Red;
            }
        }
        public Endpoint()
        {
            DatabaseAdapterFactory factory = new DatabaseAdapterFactory();

            adapters.Add(factory.Create("sqlserver"));
            adapters.Add(factory.Create("oracle"));
        }
Ejemplo n.º 5
0
        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            switch (e.Item.ItemType)
            {
            case ListItemType.Item:
            case ListItemType.AlternatingItem:
            {
                // Find secondary DDL
                DropDownList DropDownList2 = e.Item.FindControl("DropDownList2") as DropDownList;
                if (DropDownList2 != null)
                {
                    string filename = Session["InputFileName"].ToString();
                    //input fields
                    IDatabaseAdapter inputDatabase = DatabaseAdapterFactory.CreateReader(Path.GetExtension(filename), CheckBoxEditMode.Checked);
                    List <string>    tables        = (List <string>)Session["tables"];

                    inputDatabase.Connect(Session["InputFileName"].ToString());
                    Dictionary <string, int> fields = inputDatabase.GetFields(tables[0]);

                    DropDownList2.Items.Clear();
                    DropDownList2.Items.Add("");
                    foreach (KeyValuePair <string, int> row in fields)
                    {
                        var item = new ListItem(row.Key);
                        //Set field if it present in input document
                        DropDownList2.Items.Add(item);
                    }
                }
                break;
            }
            }
        }
Ejemplo n.º 6
0
        void FillMapFields()
        {
            string filename = Session["InputFileName"].ToString();
            //input fields
            IDatabaseAdapter inputDatabase = DatabaseAdapterFactory.CreateReader(Path.GetExtension(filename), CheckBoxEditMode.Checked);
            List <string>    tables        = (List <string>)Session["tables"];

            inputDatabase.Connect(filename);
            Dictionary <string, int> fields = inputDatabase.GetFields(tables[0]);

            //target fields
            TableProcessorNS.TableProcessor tp = new TableProcessorNS.TableProcessor();
            List <string> modules           = (List <string>)Session["Modules"];
            var           processorFileName = Server.MapPath(Path.Combine("Modules", modules[0]));

            tp.SetRecordProcessor(processorFileName);

            Dictionary <Field, bool> transformFields = tp.GetTransformFields();

            DataTable transformFieldsTable = new DataTable();

            transformFieldsTable = new DataTable();
            transformFieldsTable.Columns.Add("targetField");
            transformFieldsTable.Columns.Add("inputField");
            transformFieldsTable.Columns["targetField"].ReadOnly = true;

            foreach (KeyValuePair <Field, bool> row in transformFields)
            {
                transformFieldsTable.Rows.Add(row.Key.Name, "");
            }

            Repeater1.DataSource = transformFieldsTable;
            Repeater1.DataBind();
        }
        public void Test()
        {
            DatabaseAdapterFactory factory = new DatabaseAdapterFactory();
            IDatabaseAdapter       a       = factory.Create("oracle");
            IDatabaseAdapter       b       = factory.Create("sqlserver");

            b.SetData(a.GetData());
        }
        public void Test1()
        {
            DatabaseAdapterFactory factory = new DatabaseAdapterFactory();
            IDatabaseAdapter       adapter = factory.Create("oracle");

            Assert.AreEqual("oracle", adapter.ProviderName);
            Assert.IsInstanceOf(typeof(OracleAdapter), adapter);
        }
        public void Test()
        {
            DatabaseAdapterFactory factory = new DatabaseAdapterFactory();
            IDatabaseAdapter       adapter = factory.Create("oracle");

            Assert.AreEqual <string>("oracle", adapter.ProviderName);
            Assert.AreEqual <Type>(typeof(OracleAdapter), adapter.GetType());
        }
        /// <summary>
        /// Resets a given users password
        /// </summary>
        /// <param name="userMail">The mail of the of which the pw should be reset.</param>
        /// <returns>MethodResult containing generated password.</returns>
        private static MethodResult <string> InnerResetPassword(string userMail)
        {
            var newPassword = PasswordGenerator.GeneratePw();
            var result      = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>().ResetPassword(userMail, newPassword);

            return(result.IsSucceeded()
                ? new MethodResult <string>(newPassword)
                : new MethodResult <string>(result == null ? SuccessState.UnknownError : result.Status, result?.UserMessage, null));
        }
        /// <summary>
        /// Gets the feed data.
        /// </summary>
        /// <param name="userId">The user id.</param>
        /// <param name="feedId">The feed id.</param>
        /// <param name="page">The requested page.</param>
        /// <param name="showArchived">A value indicating whether the archived articles should be shown or not.</param>
        /// <returns>List of <see cref="ShortArticle"/>s within the feed.</returns>
        public IReadOnlyCollection <ShortArticle> GetFeed(Guid userId, Guid feedId, int page, bool showArchived)
        {
            var adapter       = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>();
            var data          = adapter.GetFeedRequestData(userId, feedId);
            var since         = showArchived ? DateTime.MinValue : data.Item2;
            var inheritedUnit = adapter.GetUnitInheritedBlackList(userId);

            return(DatabaseAdapterFactory.GetControllerInstance <IIndexerService>().GetFeedAsync(data.Item1, since, data.Item3, page, inheritedUnit).Result);
        }
Ejemplo n.º 12
0
        public Endpoint()
        {
            DatabaseAdapterFactory factory = new DatabaseAdapterFactory();

            adapters.Add(factory.Create("sqlserver"));
            adapters.Add(factory.Create("oracle"));

            // 构造函数部分执行其他Adapter的构造、准备工作的相关任务
        }
        public void GetControllerTest()
        {
            var firstController = DatabaseAdapterFactory.GetControllerInstance <IIndexerService>();

            Assert.IsNotNull(firstController);

            var secondController = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>();

            Assert.IsNotNull(secondController);
        }
        /// <summary>
        /// Attempts to change the password.
        /// </summary>
        /// <param name="user">The users mail address</param>
        /// <param name="newPassword">The new user password.</param>
        /// <returns>MethodResult indicating success.</returns>
        public MethodResult ChangePassword(User user, string newPassword)
        {
            if (string.IsNullOrWhiteSpace(newPassword))
            {
                throw new InvalidDataException("Invalid password");
            }
            var result = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>().ChangePassword(user, newPassword);

            if (result.IsSucceeded())
            {
                QuerySendMailAsync(user, ClipperTexts.PasswordChangedMailSubject, ClipperTexts.PasswordChangedMailBody);
            }

            return(result);
        }
        public void InvalidControllerInterface()
        {
            Exception t = null;

            try
            {
                // ReSharper disable once UnusedVariable
                var tmp = DatabaseAdapterFactory.GetControllerInstance <IClipperUserAPI>();
            }
            catch (Exception e)
            {
                t = e;
            }

            Assert.IsTrue(t is ArgumentOutOfRangeException);
        }
        /// <summary>
        /// Notifies the Observer that (probably) new web page content has been detected by a crawler.
        /// Note: Must be thread safe
        /// </summary>
        /// <param name="title">The title.</param>
        /// <param name="description">The image description</param>
        /// <param name="link">The link.</param>
        /// <param name="imageLink">The link of the image.</param>
        /// <param name="published">The published date.</param>
        /// <param name="source">The source.</param>
        /// <returns>If indexing is required: a task with the corresponding indexing job.
        /// <para>Otherwise: a completed Task</para></returns>
        public Task NotifyNewImageContentFoundThreadSafe(string title, string description, string imageLink, string link,
                                                         DateTime published, Source source)
        {
            if (DoesNotViolateBlackList(source, title) && DoesNotViolateBlackList(source, description))
            {
                var article = new Article(Guid.NewGuid(),
                                          title,
                                          link,
                                          imageLink,
                                          description,
                                          published,
                                          DateTime.UtcNow,
                                          source.Id);
                var job = DatabaseAdapterFactory.GetControllerInstance <IIndexerService>().IndexArticleThreadSafeAsync(article);
                return(job ?? Task.CompletedTask);
            }

            return(Task.CompletedTask);
        }
        public void IndexArticleTest()
        {
            var elasticController = DatabaseAdapterFactory.GetControllerInstance <IIndexerService>();
            var milliseconds      = DateTimeOffset.Now.ToUnixTimeMilliseconds();
            var guid        = Guid.NewGuid();
            var indexedguid = Guid.NewGuid();
            var articleOne  = new Article(guid, "abgef" + milliseconds,
                                          "http://" + milliseconds + ".de", "http://" + milliseconds + ".de", "abgefssmt",
                                          DateTime.Today, DateTime.Today, indexedguid);

            try
            {
                elasticController.IndexArticleThreadSafeAsync(articleOne);
                Assert.IsTrue(true);
            }
            catch (Exception)
            {
                Assert.Fail();
            }
        }
        private void buttonStart_Click(object sender, System.EventArgs e)
        {
            buttonStart.Enabled = false;
            try
            {
                string filename    = textBoxInputFileName.Text.Trim();
                string outfilename = textBoxOutputFileName.Text.Trim();
                //extract settings
                tp.InputDatabase = DatabaseAdapterFactory.CreateReader(Path.GetExtension(filename), CheckBoxEditMode.Checked);

                tp.InputDatabase.FileName = filename;
                //transform settings
                tp.tableName          = comboBoxTableName.Text;
                tp.InputFieldNamesMap = TableProcessor.DeserializeFieldsMap(textBoxFieldsMapping.Text);

                //load settings

                //If Edit mode - copy original and open for wrtiting
                if (CheckBoxEditMode.Checked)
                {
                    tp.OutputDatabase = DatabaseAdapterFactory.CreateWriter(Path.GetExtension(outfilename));
                    tp.ProcessMode    = ProcessMode.pmEdit;
                }

                tp.OutputDatabase.FileName = outfilename;

                tp.Progress = new ProgressBarMonitor(toolStripProgressBar1, toolStripStatusLabel1, 100);

                int.TryParse(textBoxOffset.Text, out tp.ProcessOffset);

                tp.Process();

                string Msg = Path.GetFileName(tp.InputDatabase.FileName) + " processing complete";
                MessageBox.Show(this, Msg, "Results");
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message + " " + ex.StackTrace, "Error");
            }
            buttonStart.Enabled = true;
        }
Ejemplo n.º 19
0
        void FillTables()
        {
            //OleDbDatabaseAdapter inputDatabase = new OleDbDatabaseAdapter();
            string           infilename    = Session["InputFileName"].ToString();
            IDatabaseAdapter inputDatabase = DatabaseAdapterFactory.CreateReader(Path.GetExtension(infilename), CheckBoxEditMode.Checked);

            inputDatabase.FileName = infilename;

            string[] tables = inputDatabase.GetTables();

            CheckBoxListTables.Items.Clear();
            foreach (string tablename in tables)
            {
                CheckBoxListTables.Items.Add(tablename);
            }

            if (CheckBoxListTables.Items.Count == 1)
            {
                CheckBoxListTables.Items[0].Selected = true;
            }
        }
Ejemplo n.º 20
0
        protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
        {
            Session["progress"] = new BaseProgress();
            SetMappings();
            //Start Processing
            TableProcessorNS.TableProcessor tp = new TableProcessorNS.TableProcessor();
            tp.Progress = (BaseProgress)Session["progress"];

            string inputFileName  = Session["InputFileName"].ToString().Trim();
            string outputFileName = Path.Combine(Path.GetDirectoryName(inputFileName), TextBoxOutputFileName.Text);

            tp.InputDatabase          = DatabaseAdapterFactory.CreateReader(Path.GetExtension(inputFileName), CheckBoxEditMode.Checked);
            tp.InputDatabase.FileName = inputFileName;
            tp.InputDatabase.Connect(inputFileName);
            List <string> tables = (List <string>)Session["tables"];

            tp.tableName = tables[0];
            List <string> modules = (List <string>)Session["Modules"];

            tp.SetRecordProcessor(Server.MapPath(Path.Combine("Modules", modules[0])));

            tp.InputFieldNamesMap = TableProcessor.DeserializeFieldsMap((string)Session["Mappings"]);



            //If Edit mode - copy original and open for wrtiting
            if (CheckBoxEditMode.Checked)
            {
                tp.OutputDatabase = DatabaseAdapterFactory.CreateWriter(Path.GetExtension(outputFileName));
                tp.ProcessMode    = ProcessMode.pmEdit;
            }

            tp.OutputDatabase.FileName = outputFileName;

            Thread run = new Thread(new ThreadStart(tp.Process));

            run.Start();
            Response.Write("Process started");
        }
        /// <summary>
        /// Administratively adds a user.
        /// </summary>
        /// <param name="toAdd">The user to add.</param>
        /// <param name="userUnits">The users units.</param>
        /// <returns>MethodResult indicating success.</returns>
        public MethodResult AdministrativelyAddUser(User toAdd, IReadOnlyList <Guid> userUnits)
        {
            var password = PasswordGenerator.GeneratePw();
            var result   = Factory.GetControllerInstance <IClipperDatabase>().AddUser(toAdd.MailAddress, toAdd.UserName,
                                                                                      password, toAdd.Role, toAdd.PrincipalUnitId,
                                                                                      userUnits[0], true, true);
            MethodResult innerResult = result;

            if (result.IsSucceeded())
            {
                if (userUnits.Count > 1)
                {
                    innerResult = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>()
                                  .SetUserOrganizationalUnits(result.Result, userUnits.Skip(1));
                }

                QuerySendMailAsync(toAdd, ClipperTexts.AccountCreatedMailSubject,
                                   string.Format(ClipperTexts.AccountCreatedMailBody, toAdd.UserName, password));
            }

            return(innerResult);
        }
        /// <summary>
        /// Notifies the Observer that a (probably) new Rss feed item has been detected by a crawler.
        /// Note: Must be thread safe
        /// </summary>
        /// <param name="item">The item to index</param>
        /// <param name="rssKey">The belonging rss key.</param>
        /// <param name="source">The source.</param>
        /// <returns>If indexing is required: a task with the corresponding indexing job.
        /// <para>Otherwise: a completed Task</para></returns>
        public Task NotifyNewRssFeedFoundThreadSave(SyndicationItem item, RssKey rssKey, Source source)
        {
            var plainText  = item.Summary?.Text?.GetTextFromHtml() ?? string.Empty;
            var plainTitle = item.Title?.Text.GetTextFromHtml() ?? source.Name;

            if (DoesNotViolateBlackList(source, plainText) && DoesNotViolateBlackList(source, plainTitle))
            {
                var article = new Article(Guid.NewGuid(),
                                          plainTitle,
                                          rssKey.Link,
                                          null,
                                          plainText,
                                          new DateTime(rssKey.Updated),
                                          DateTime.UtcNow,
                                          source.Id);
                var job = DatabaseAdapterFactory.GetControllerInstance <IIndexerService>()
                          .IndexRssFeedItemThreadSafeAsync(article, rssKey);
                return(job ?? Task.CompletedTask);
            }

            return(Task.CompletedTask);
        }
        /// <summary>
        /// Modifies the user.
        /// </summary>
        /// <param name="toModify">The user to modify.</param>
        /// <param name="userUnits">The users units.</param>
        /// <returns>MethodResult indicating success.</returns>
        public MethodResult ModifyUser(User toModify, IReadOnlyList <Guid> userUnits)
        {
            var adapter     = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>();
            var currentUser = GetUserInfo(toModify.Id);

            if (toModify.UserMailAddress != currentUser.MailAddress)
            {
                var result = ChangeMailAddress(toModify, toModify.UserMailAddress);
                if (!result.IsSucceeded())
                {
                    return(result);
                }
            }

            if (toModify.UserName != currentUser.UserName || toModify.Role != currentUser.Role ||
                toModify.IsValid != currentUser.IsValid ||
                !userUnits.ToHashSet().SetEquals(currentUser.OrganizationalUnits.Select(x => x.Id)))
            {
                return(adapter.ModifyUser(toModify.Id, toModify.UserName, toModify.Role, toModify.IsValid, userUnits));
            }

            return(new MethodResult());
        }
Ejemplo n.º 24
0
        public static T GetControllerInstance <T>()
        {
            if (typeof(T) == typeof(IClipperUserAPI) ||
                typeof(IClipperSystemAdministratorAPI) == typeof(T) ||
                typeof(IClipperStaffChiefAPI) == typeof(T))
            {
                return((T)(object)new UserController());
            }

            if (typeof(T) == typeof(IClipperDatabase))
            {
                return((T)DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>());
            }

            if (typeof(T) == typeof(IClipperService))
            {
                return((T)(object)new StatusController());
            }

            if (typeof(T) == typeof(IClipperOrganizationalUnitAPI))
            {
                return((T)(object)new OrganizationalUnitController());
            }

            if (typeof(T) == typeof(ICrawlerController))
            {
                return((T)(object)CrawlerController.GetCrawlerController());
            }

            if (typeof(T) == typeof(INotificationController))
            {
                return((T)(object)new NotificationControllerWrapper());
            }

            throw new ArgumentOutOfRangeException(nameof(T));
        }
 /// <summary>
 /// Gets the user settings.
 /// </summary>
 /// <param name="userId">The user id.</param>
 /// <returns>The settings of the given user.</returns>
 public UserSettings GetUserSettings(Guid userId)
 {
     return(DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>().GetUserSettingsByUserId(userId));
 }
 /// <summary>
 /// Gets a specific article.
 /// </summary>
 /// <param name="articleId">The article id.</param>
 /// <returns>The (full) <see cref="Article"/>.</returns>
 public Article GetArticle(Guid articleId)
 {
     return(DatabaseAdapterFactory.GetControllerInstance <IIndexerService>().GetArticleAsync(articleId).Result);
 }
Ejemplo n.º 27
0
        /// <summary>
        /// Checks if new feeds available and if notification and what kind of notification is wanted.
        /// </summary>
        /// <param name="timerState">The timer state.</param>
        private static void CheckForNotifications(object timerState)
        {
            using (new PerfTracer(nameof(CheckForNotifications)))
            {
                try
                {
                    Scheduler.Change(Timeout.Infinite, Timeout.Infinite);
                    var notifiableUserSettings = Factory.GetControllerInstance <IClipperDatabase>().GetNotifiableUserSettings();
                    var parallelOpts           = new ParallelOptions
                    {
                        MaxDegreeOfParallelism = AppConfiguration.MaxNotificationJobDegreeOfParallelism
                    };
                    Parallel.ForEach(notifiableUserSettings, parallelOpts, (notifiable) =>
                    {
                        if (notifiable != null && notifiable.Settings != null &&
                            notifiable.Settings.NotificationSettings != NotificationSetting.None &&
                            notifiable.Settings.Feeds.Any())
                        {
                            var lastFetched = LastCheckTime.TryGetOrAddIfNotPresentOrNull(notifiable.UserId);
                            if (lastFetched < notifiable.LastLoginTime)
                            {
                                lastFetched = notifiable.LastLoginTime;
                            }

                            if (lastFetched.AddMinutes(notifiable.Settings.NotificationCheckIntervalInMinutes) <= DateTime.UtcNow)
                            {
                                LastCheckTime[notifiable.UserId] = DateTime.UtcNow;
                                var indexer = DatabaseAdapterFactory.GetControllerInstance <IIndexerService>();
                                var feeds   = indexer.GetCompleteFeedAsync(notifiable.Settings, lastFetched).GetAwaiter().GetResult();

                                if (feeds.Any())
                                {
                                    // We need to loop though all (-> blacklists)
                                    // Anyways one query to determine if at least something COULD be relevant is way better than x querys
                                    // which determine nothing is relevant at all.
                                    var blackList = DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>()
                                                    .GetUnitInheritedBlackList(notifiable.UserId);

                                    //These can run in parallel aswell, as the main amount of time is waiting for elastic
                                    feeds = notifiable.Settings.Feeds
                                            .AsParallel()
                                            .WithDegreeOfParallelism(AppConfiguration.MaxNotificationJobDegreeOfParallelism)
                                            .Select(f => indexer.GetFeedAsync(f, lastFetched, 100000, 0, blackList).Result)
                                            .SelectMany(s => s)
                                            .Distinct(ArticleComparer.ShortArticleComparer).ToList();
                                    if (feeds.Any())
                                    {
                                        var defText = "Visit " + AppConfiguration.MailConfigurationFELoginLink + notifiable.PrincipalUnitName;
                                        if (notifiable.Settings.NotificationSettings == NotificationSetting.PdfPerMail)
                                        {
                                            var pdf = PdfGenerator.GeneratePdf(feeds, notifiable.UserName);
                                            MailController.QuerySendMailAsync(notifiable, ClipperTexts.DefaultMailSubject, defText,
                                                                              pdf, "Clipper.pdf");
                                        }
                                        else
                                        {
                                            MailController.QuerySendMailAsync(notifiable, ClipperTexts.DefaultMailSubject, defText);
                                        }
                                    }
                                }
                            }
                        }
                    });
                }
                catch (Exception error)
                {
                    Console.WriteLine(error);
                }
                finally
                {
                    Scheduler.Change(60 * 1000, Timeout.Infinite);
                }
            }
        }
 /// <summary>
 /// Gets all information on a user
 /// </summary>
 /// <param name="requested">The id of the user whose information is requested</param>
 /// <returns>All the information on a user like the <see cref="OrganizationalUnit"/>s he belongs to</returns>
 public ExtendedUser GetUserInfo(Guid requested)
 {
     return(DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>().GetUserInfo(requested));
 }
 /// <summary>
 /// Gets the minimal information of the users a staffchief can manage
 /// </summary>
 /// <param name="userId">The id of the staffchief</param>
 /// <returns>A list of <see cref="BasicUserInformation"/> if the given id actually belonged to a staffchief</returns>
 public IReadOnlyList <BasicUserInformation> GetManageableUsers(Guid userId)
 {
     return(DatabaseAdapterFactory.GetControllerInstance <IClipperDatabase>().GetManageableUsers(userId));
 }
 /// <summary>
 /// Clears all indexes (use with care, this is a permanent operation).
 /// </summary>
 public void ClearAllIndexes()
 {
     DatabaseAdapterFactory.GetControllerInstance <IIndexerService>().ClearIndex();
 }