コード例 #1
0
        public MessageTO sendDraft(string pwd, Int32 messageId, Int32 messageOplock)
        {
            MessageTO result = new MessageTO();

            if (String.IsNullOrEmpty(pwd))
            {
                result.fault = new FaultTO("Missing pwd");
            }
            else if (messageId <= 0)
            {
                result.fault = new FaultTO("Must supply a valid message ID");
            }

            try
            {
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    SecureMessageDao dao = new SecureMessageDao(cxn);
                    gov.va.medora.mdo.domain.sm.Message msg = new Message()
                    {
                        Id = messageId, Oplock = messageOplock
                    };
                    result = new MessageTO(dao.sendDraft(msg));
                }
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }

            return(result);
        }
コード例 #2
0
        public MessageTO sendReplyMessage(string pwd, Int32 replyingToMessageId, Int32 senderId, Int32 recipientId, string messageBody)
        {
            MessageTO result = new MessageTO();

            if (replyingToMessageId <= 0)
            {
                result.fault = new FaultTO("Missing reply message ID");
            }
            else if (senderId <= 0)
            {
                result.fault = new FaultTO("Missing sender ID");
            }
            //else if (recipientId <= 0)
            //{
            //    result.fault = new FaultTO("Missing recipient ID");
            //}
            else if (String.IsNullOrEmpty(messageBody))
            {
                result.fault = new FaultTO("Must supply a message body");
            }

            if (result.fault != null)
            {
                return(result);
            }

            try
            {
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    SecureMessageDao dao        = new SecureMessageDao(cxn);
                    Message          replyingTo = dao.getMessage(replyingToMessageId);
                    if (replyingTo == null || replyingTo.Id <= 0)
                    {
                        throw new Exception("No message found for that ID");
                    }

                    Message newReply = new Message()
                    {
                        SentDate      = DateTime.Now,
                        SenderId      = senderId,
                        RecipientId   = recipientId,
                        Body          = messageBody,
                        Checksum      = StringUtils.getMD5Hash(messageBody),
                        MessageThread = replyingTo.MessageThread
                    };

                    result = new MessageTO(dao.sendReply(replyingTo, newReply));
                }
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }

            return(result);
        }
コード例 #3
0
        public MessageTO getTablesUploadResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.TablesUploadResponse;

            if (request == null || request.CompressedDataTables == null || request.CompressedDataTables.Count == 0 ||
                request.Configuration == null)
            {
                response.MessageType = MessageTypeTO.Error;
                response.Message     = _errorMsg;
                return(response);
            }

            try
            {
                // some times this takes a while - we don't want to wait so we'll do it in a seperate thread
                Thread extractThread = new Thread(new ParameterizedThreadStart(extractAndVerify));
                extractThread.IsBackground = true;
                // passing this ParamterizedThreadStart an ugly object but seems to be most efficient way to handle
                extractThread.Start(new KeyValuePair <ExtractorConfiguration, Dictionary <string, byte[]> >
                                        (request.Configuration, request.CompressedDataTables));
            }
            catch (Exception exc)
            {
                //LOG.Error(exc);
            }
            return(response);
        }
コード例 #4
0
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("***** Start DownstreamException String *****");
            if (!String.IsNullOrEmpty(Message))
            {
                sb.AppendLine("Message: " + Message);
            }
            if (InnerException != null)
            {
                sb.AppendLine("Inner Exception: " + InnerException.ToString());
            }
            if (Extractor != null)
            {
                sb.AppendLine("Extractor: " + Extractor.ToString());
            }
            if (VistaQuery != null)
            {
                sb.AppendLine("Vista Query: " + VistaQuery.ToString());
            }
            if (ExtractorConfiguration != null)
            {
                sb.AppendLine("Extractor Config: " + ExtractorConfiguration.ToString());
            }
            if (MessageTO != null)
            {
                sb.AppendLine("MessageTO Object: " + MessageTO.ToString());
            }
            sb.AppendLine("***** End DownstreamException String *****");
            return(sb.ToString());
        }
コード例 #5
0
        public MessageTO getZipFileUploadResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.ZipFileUploadResponse;

            if (request == null || request.ZippedFile == null || request.ZippedFile.Length == 0)
            {
                response.MessageType = MessageTypeTO.Error;
                response.Message     = _errorMsg;
                return(response);
            }

            try
            {
                // some times this takes a while - we don't want to wait so we'll do it in a seperate thread
                FileDao fileDao       = new FileDao();
                Thread  extractThread = new Thread(new ParameterizedThreadStart(fileDao.extractFiles));
                extractThread.IsBackground = true;
                extractThread.Start(new KeyValuePair <string, byte[]>(request.Message, request.ZippedFile));
            }
            catch (Exception exc)
            {
                //LOG.Error(exc);
            }
            return(response);
        }
コード例 #6
0
        public MessageTO getTableUploadResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.TableUploadResponse;

            if (request == null || request.VistaData == null || String.IsNullOrEmpty(request.VistaData.TableName) ||
                request.VistaData.Rows == null || request.VistaData.Rows.Count <= 0 || request.Configuration == null)
            {
                //LOG.Debug("Received an invalid table upload request - notifying client");
                response.MessageType = MessageTypeTO.Error;
                response.Error       = "Invalid table upload request!";
                return(response);
            }

            try
            {
                FileDao fileDao = new FileDao();
                response.Message = fileDao.saveToFile(request.VistaData, request.Configuration.ExtractMode);
            }
            catch (Exception exc)
            {
                response.MessageType = MessageTypeTO.Error;
                response.Error       = exc.ToString();
            }
            return(response);
        }
コード例 #7
0
        /// <summary>
        /// Get all the extractors currently running.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public MessageTO getExtractorsResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.ExtractorsResponse;
            response.Extractors  = Extractors.GetExtractors();
            return(response);
        }
コード例 #8
0
 internal MessageTO getResumeResponse(MessageTO request, Server server)
 {
     server.SocketContainer.Locked = false;
     return(new MessageTO()
     {
         MessageType = MessageTypeTO.ResumeResponse, Message = "Server Unlocked"
     });
 }
コード例 #9
0
 /// <summary>
 /// Downstream extractor constructor. Any of the domain specific arguments can be null
 /// </summary>
 /// <param name="extractor"></param>
 /// <param name="extractorConfig"></param>
 /// <param name="vistaQuery"></param>
 /// <param name="messageTO"></param>
 /// <param name="message"></param>
 /// <param name="inner"></param>
 public DownstreamException(Extractor extractor, ExtractorConfiguration extractorConfig, VistaQuery vistaQuery,
                            MessageTO messageTO, string message, Exception inner)
     : base(message, inner)
 {
     Extractor = extractor;
     ExtractorConfiguration = extractorConfig;
     VistaQuery             = vistaQuery;
     MessageTO = messageTO;
 }
コード例 #10
0
        public String getNextRunTime()
        {
            Client    c        = new Client(_orchestratorHostName, _orchestratorPort);
            MessageTO response = c.submitRequest(new MessageTO()
            {
                MessageType = MessageTypeTO.TimeToNextRunRequest
            });

            return(response.Message);
        }
コード例 #11
0
        public MessageTO getTimeToNextRunResonse()
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.TimeToNextRunResponse;

            response.Message = this.ServiceState.NextRun.ToString();

            return(response);
        }
コード例 #12
0
        public MessageTO moveMessage(string pwd, Int32 userId, Int32 messageId, Int32 newFolderId)
        {
            MessageTO result = new MessageTO();

            pwd = getConnectionString(pwd);

            if (String.IsNullOrEmpty(pwd))
            {
                result.fault = new FaultTO("No connection string specified or configured");
            }

            if (result.fault != null)
            {
                return(result);
            }

            try
            {
                Message message = new Message();
                message.Id         = messageId;
                message.Addressees = new List <Addressee>()
                {
                    new Addressee()
                    {
                        FolderId = newFolderId, Owner = new User()
                        {
                            Id = userId
                        }
                    }
                };
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    AddresseeDao dao = new AddresseeDao(cxn);
                    message.Addressees[0] = dao.moveMessage(new Message()
                    {
                        Id = messageId
                    }, new User()
                    {
                        Id = userId
                    }, new Folder()
                    {
                        Id = newFolderId
                    });
                    result = new MessageTO(message);
                }
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }
            return(result);
        }
コード例 #13
0
        internal String getLastRunCompletedTime()
        {
            Client    c        = new Client(_orchestratorHostName, _orchestratorPort);
            MessageTO response = c.submitRequest(new MessageTO()
            {
                MessageType = MessageTypeTO.LastRunInfoRequest
            });

            //return gov.va.medora.utils.JsonUtils.Deserialize<KeyValuePair<String, DateTime>>(response.Message);
            return(response.Message); // will be JSON serialized KeyValuePair<String, DateTime>
        }
コード例 #14
0
        /// <summary>
        /// Check to see if any post processing needs to happen for this file. If so, do it.
        /// </summary>
        /// <param name="request">The last request we serviced</param>
        private void postProcess(object obj)
        {
            MessageTO request = (MessageTO)obj;

            // Set up
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.JobCompletedResponse;

            // Protect
            if (request == null || String.IsNullOrEmpty(request.Configuration.SiteCode) ||
                String.IsNullOrEmpty(request.Configuration.QueryConfigurations.RootNode.Value.File))
            {
                return;
            }

            // Do our work
            try
            {
                String  sqlProvider      = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlProvider];
                String  connectionString = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlConnectionString];
                ISqlDao sqlDao           = new SqlDaoFactory().getSqlDao(new SqlConnectionFactory().getConnection(sqlProvider, connectionString));

                //if (request.Configuration.ON_COMPLETE != null)
                //{
                if (ActiveExtractions.ExistsByFile(request.Configuration.QueryConfigurations.RootNode.Value.File)
                    ||
                    WorkStack.ExistsByFile(request.Configuration.QueryConfigurations.RootNode.Value.File)
                    )
                {
                }
                else
                {
                    //sqlDao.executeDelimited(request.Configuration.ON_COMPLETE, 5 * 60 * 1000);
                    //// for each query configuration, disable indexes on the file
                    //IList<string> distinctFiles = new List<string>();
                    //parseDistinctFiles(request.Configuration.QueryConfigurations.RootNode, distinctFiles);
                    //foreach (string file in distinctFiles)
                    //{
                    //    sqlDao.enableIndexes(file);
                    //}
                    // TODO: Add support for the SQL server version of this
                    //sqlDao.executeStoredProcedureNoArguments(request.Configuration.QueryConfigurations.RootNode.Value.File + "_END", 10 * 60 * 1000);
                    sqlDao.postProcess(request.Configuration.QueryConfigurations.RootNode);
                }
                //}
            }
            catch
            {
                // TODO: REQ HANDLER NEEDS A LOGGING MECHANISM THAT IS THREAD-SAFE
            }
        }
コード例 #15
0
 public void logMessage(MessageTO request)
 {
     //LOG.Error("An extraction job uploaded the following error: " + request.Error);
     try
     {
         System.Net.Mail.SmtpClient mail = new System.Net.Mail.SmtpClient("smtp.va.gov", 25);
         mail.SendAsync("*****@*****.**", "*****@*****.**", "Log Error Request From Client", request.Error, new object());
     }
     catch (Exception exc)
     {
         //LOG.Error("Unable to send email about error log request!", exc);
     }
 }
コード例 #16
0
        public WebFleetMessage Map(MessageTO msg)
        {
            var result = new WebFleetMessage()
            {
                MessageId    = msg.messageId,
                MessageTime  = msg.messageTime,
                MessageText  = msg.messageText,
                PositionText = msg.positionText,
                ObjectNumber = [email protected],
            };

            SetMessageStatusFromText(result);

            return(result);
        }
コード例 #17
0
        /// <summary>
        /// Check if the orchestrator has jobs on it's work stack. Returns the number of jobs in the message property.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public MessageTO getServerHasWorkResponse(MessageTO request)
        {
            MessageTO response = new MessageTO()
            {
                MessageType = MessageTypeTO.ServerHasWorkResponse,
                Message     = "0"
            };

            //LOG.Debug("Telling client we have " + WorkStack.Count() + " jobs on the stack");
            if (!_locked && WorkStack != null && WorkStack.Count() > 0)
            {
                response.Message = WorkStack.Count().ToString();
            }
            return(response);
        }
コード例 #18
0
        public MessageTO deleteDraft(string pwd, Int32 messageId)
        {
            MessageTO result = new MessageTO();

            pwd = getConnectionString(pwd);

            if (String.IsNullOrEmpty(pwd))
            {
                result.fault = new FaultTO("No connection string specified or configured");
            }
            else if (messageId <= 0)
            {
                result.fault = new FaultTO("Missing message ID");
            }

            if (result.fault != null)
            {
                return(result);
            }

            try
            {
                Message message = new Message()
                {
                    Id = messageId
                };
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    SecureMessageDao dao = new SecureMessageDao(cxn);
                    dao.deleteDraft(message);
                }
                message.Addressees    = null;
                message.MessageThread = null;
                message.Body          = "OK";
                message.Id            = -1;
                result = new MessageTO(message);
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }

            return(result);
        }
コード例 #19
0
        public dto.sm.MessageTO readMessage(string pwd, Int32 addresseeId, Int32 addresseeOplock)
        {
            MessageTO result = new MessageTO();

            pwd = getConnectionString(pwd);

            if (String.IsNullOrEmpty(pwd))
            {
                result.fault = new FaultTO("No connection string specified or configured");
            }
            else if (addresseeId <= 0)
            {
                result.fault = new FaultTO("Must supply addressee ID");
            }
            if (result.fault != null)
            {
                return(result);
            }

            try
            {
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    AddresseeDao dao = new AddresseeDao(cxn);
                    gov.va.medora.mdo.domain.sm.Addressee addressee = dao.readMessage(new Addressee()
                    {
                        Id = addresseeId, Oplock = addresseeOplock
                    });
                    MessageTO message = new MessageTO(addressee.Message);
                    message.addressees = new AddresseeTO[1] {
                        new AddresseeTO(addressee)
                    };
                    result = message;
                }
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }

            return(result);
        }
コード例 #20
0
        /// <summary>
        /// This method sets the internal shutdown flag of the RequestHandler. Subsequent calls to RequestHandler.getInstance().getShutdownSignal()
        /// should return true. Note no asynchronous events occur on the parent thread or process
        /// </summary>
        /// <param name="request">MessageTO</param>
        /// <returns>MessageTO</returns>
        public MessageTO getStopJobResponse(MessageTO request)
        {
            // some notes... this is not thread safe because RequestHandler is a singleton. instead, it appears the best
            // way to enable this sort of coordination is to share local service state for a thread with it's Server
            // and just put a hook in to check for changing job status
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.StopServerResponse;
            _shutdownSignal      = true;
            response.Message     = "OK";
            if (this.ServiceState != null)
            {
                this.ServiceState.Status      = ServiceStatus.STOPPED;
                this.ServiceState.StatusSetBy = request.HostName;
            }
            //LOG.Info("Stopping extraction job at request of orchestrator. Reason: " + request.Message);
            return(response);
        }
コード例 #21
0
 internal MessageTO getPauseResponse(MessageTO request, Server server)
 {
     if (server.SocketContainer.Locked)
     {
         return(new MessageTO()
         {
             MessageType = MessageTypeTO.PauseResponse, Message = "Server already locked"
         });
     }
     else
     {
         server.SocketContainer.Locked = true;
         return(new MessageTO()
         {
             MessageType = MessageTypeTO.PauseResponse, Message = "Server Locked"
         });
     }
 }
コード例 #22
0
        public void UserInterfaceTest()
        {
            //			UserInterfaceRole AssistanteRole = new UserInterfaceRole();
            AdminInterfaceRole AssistanteRole = new AdminInterfaceRole();
            AdminInterfaceRole Garbage        = new AdminInterfaceRole();

            StructMessage structure = new StructMessage()
            {
                MessageType = MessageType.chat,
                IdSender    = 1,
                IdReceiver  = 2,
                Title       = "subject",
                Email       = "*****@*****.**",
                Content     = "",
                IsSent      = false,
                Date        = new DateTime(),
                Id          = 0
            };

            MessageTO message0 = new MessageTO(new StructMessage());

            Assert.False(AssistanteRole.SendMessage(message0));

            MessageTO message = new MessageTO(structure);

            Assert.True(AssistanteRole.SendMessage(message));

            structure.IdReceiver  = 3;
            structure.MessageType = MessageType.email;
            MessageTO message1 = new MessageTO(structure);

            Assert.True(AssistanteRole.SendMessage(message1));

            structure.MessageType = MessageType.notification;
            MessageTO message2 = new MessageTO(structure);

            Assert.False(AssistanteRole.SendMessage(message2));

            Garbage.Erase();

            Assert.Equal(new List <int>()
            {
            }, AssistanteRole.GetHistory(1));
        }
コード例 #23
0
        /// <summary>
        /// Return all the work stacks
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public MessageTO getWorkStacksResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.WorkStacksResponse;

            //LOG.Debug(WorkStack.Count() + " jobs on the workstack");
            //LOG.Debug(ActiveExtractions.Count() + " active jobs");
            //LOG.Debug(ErroredExtractions.Count() + " errored jobs");
            //LOG.Debug(CompletedExtractions.Count() + " completed jobs");

            response.Configurations = new Dictionary <string, IList <ExtractorConfiguration> >();
            response.Configurations.Add("Queued", new List <ExtractorConfiguration>());
            response.Configurations.Add("Active", new List <ExtractorConfiguration>());
            response.Configurations.Add("Errored", new List <ExtractorConfiguration>());
            response.Configurations.Add("Completed", new List <ExtractorConfiguration>());

            if (WorkStack != null && WorkStack.Count() > 0)
            {
                WorkStack.CopyTo(response.Configurations["Queued"]);
            }

            if (ActiveExtractions != null && ActiveExtractions.Count() > 0)
            {
                response.Configurations["Active"] = ActiveExtractions.CopyTo(response.Configurations["Active"]);
            }

            if (ErroredExtractions != null && ErroredExtractions.Count() > 0)
            {
                response.Configurations["Errored"] = ErroredExtractions.CopyTo(response.Configurations["Errored"]);
            }

            if (CompletedExtractions != null && CompletedExtractions.Count() > 0)
            {
                response.Configurations["Completed"] = CompletedExtractions.CopyTo(response.Configurations["Completed"]);
            }

            response.Message = gov.va.medora.utils.JsonUtils.Serialize <TaggedExtractorConfigArrays>
                                   (new TaggedExtractorConfigArrays(response.Configurations));

            response.Configurations = null; // null this since we serialized the results to a JSON string

            return(response);
        }
コード例 #24
0
        public MessageTO moveMessage(string pwd, Int32 userId, Int32 messageId, Int32 newFolderId)
        {
            MessageTO result = new MessageTO();

            try
            {
                Message message = new Message();
                message.Id         = messageId;
                message.Addressees = new List <Addressee>()
                {
                    new Addressee()
                    {
                        FolderId = newFolderId, Owner = new User()
                        {
                            Id = userId
                        }
                    }
                };
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    AddresseeDao dao = new AddresseeDao(cxn);
                    message.Addressees[0] = dao.moveMessage(new Message()
                    {
                        Id = messageId
                    }, new User()
                    {
                        Id = userId
                    }, new Folder()
                    {
                        Id = newFolderId
                    });
                    result = new MessageTO(message);
                }
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }
            return(result);
        }
コード例 #25
0
        /// <summary>
        /// Handle a request specifying from which server the request originated
        /// </summary>
        /// <param name="request"></param>
        /// <param name="server"></param>
        /// <returns></returns>
        public MessageTO handleRequest(MessageTO request, Server server)
        {
            switch (request.MessageType)
            {
            case MessageTypeTO.PauseRequest:
                return(getPauseResponse(request, server));

            case MessageTypeTO.ResumeRequest:
                return(getResumeResponse(request, server));

            case MessageTypeTO.JobStatusRequest:
                return(getJobStatusResponse(request, server));

            default:
                return(handleRequest(request));
            }
            // if we somehow get down here
            return(handleRequest(request));
        }
コード例 #26
0
        internal MessageTO getJobStatusResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.JobStatusResponse;

            if (this.ServiceState != null)
            {
                // a bit kludgy but better than before... if the percentage complete is set (typically by the extractorservice) then return that.
                // otherwise return the ToString value of the current servicestate
                if (!String.IsNullOrEmpty(this.ServiceState.PercentageComplete))
                {
                    response.Message = this.ServiceState.PercentageComplete;
                }
                else
                {
                    response.Message = this.ServiceState.ToString();
                }
            }

            return(response);
        }
コード例 #27
0
        public dto.sm.MessageTO deleteAttachment(string pwd, Int32 messageId)
        {
            MessageTO result = new MessageTO();

            pwd = getConnectionString(pwd);

            if (String.IsNullOrEmpty(pwd))
            {
                result.fault = new FaultTO("No connection string specified or configured");
            }
            else if (messageId <= 0)
            {
                result.fault = new FaultTO("Invalid message ID");
            }

            if (result.fault != null)
            {
                return(result);
            }
            try
            {
                using (MdoOracleConnection cxn = new MdoOracleConnection(new mdo.DataSource()
                {
                    ConnectionString = pwd
                }))
                {
                    AttachmentDao dao   = new AttachmentDao(cxn);
                    Message       dbMsg = dao.deleteAttachmentFromMessage(messageId);
                    result = new MessageTO(dbMsg);
                }
            }
            catch (Exception exc)
            {
                result.fault = new FaultTO(exc);
            }

            return(result);
        }
コード例 #28
0
        /// <summary>
        ///  For new job requests, do the following:
        ///      1. Make sure we can call client back on specified hostname
        ///      2. Pop a job off the work stack
        ///      3. Try locking the site/file from the popped job (put job back on stack if fail)
        ///      4. Send response back to client
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public MessageTO getNewJobResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.NewJobResponse;

            if (String.Equals(request.HostName, "SansCallback") && request.ListeningPort == 0)
            {
                // this is from a test - don't require a callback
            }
            else
            {
                try
                {
                    //LOG.Debug("Received a new job response - first checking to make sure we can communicate with the client");
                    Client c = new Client();
                    c.connect(request.HostName, request.ListeningPort);
                    c.disconnect();
                    //LOG.Debug("Successfully connected to the client! Going to try sending the client a job now...");
                }
                catch (Exception exc)
                {
                    response.MessageType = MessageTypeTO.Error;
                    response.Error       = exc.ToString();
                    //LOG.Debug("Couldn't call back client who requested new job!", exc);
                    return(response);
                }
            }

            if (this.WorkStack == null)
            {
                //LOG.Debug("The work stack is null! Has the application been initialized properly?");
                response.MessageType = MessageTypeTO.Error;
                response.Error       = "The WorkStack has not been initialized!";
                return(response);
            }
            // I think we were opening up a race condition here - now we just try and pop a job and see if we got one
            // instead of making a call for the count and then another to pop a job
            //if (WorkStack.Count() == 0)
            //{
            //    LOG.Debug("Looks like there are no more jobs on the work stack! Tell the client thanks but nothing to do");
            //    response.Message = "No more jobs on the stack!";
            //    return response;
            //}

            //LOG.Debug("Found a job for the client - popping it off the stack");

            // Don't process new jobs if we are currently locked
            if (_locked)
            {
                response.Message = "No more jobs on the stack!";
                return(response);
            }

            //ExtractorConfiguration responseConfig = WorkStack.PopSiteUnique(ActiveExtractions);
            ExtractorConfiguration responseConfig = WorkStack.Pop();

            if (responseConfig == null)
            {
                //LOG.Debug("Looks like there are no more jobs on the work stack! Tell the client thanks but nothing to do");
                response.Message = "No more jobs on the stack!";
                return(response);
            }
            String  sqlProvider      = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlProvider];
            String  connectionString = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlConnectionString];
            ISqlDao sqlDao           = new SqlDaoFactory().getSqlDao(new SqlConnectionFactory().getConnection(sqlProvider, connectionString));

            try
            {
                if (!sqlDao.lockSite(responseConfig.SiteCode, responseConfig.QueryConfigurations.RootNode.Value.File,
                                     request.HostName, Convert.ToInt16(request.ListeningPort)))
                {
                    //LOG.Debug("Unable to lock the new job for the client! Tell them we couldn't assign a new job");
                    response.MessageType = MessageTypeTO.Error;
                    response.Error       = "Unable to lock site!";
                    return(response);
                }
            }
            catch (Exception exc)
            {
                WorkStack.Push(responseConfig); // put it back on stack if error occured

                response.MessageType = MessageTypeTO.Error;
                response.Error       = exc.ToString();
                //LOG.Error(exc);
                return(response);
            }

            ActiveExtractions.Push(responseConfig);
            response.Configuration = responseConfig;
            response.Extractor     = new Extractor(request.HostName, request.ListeningPort,
                                                   response.Configuration.SiteCode, response.Configuration.QueryConfigurations.RootNode.Value.File, DateTime.Now);

            Extractors.Add(response.Extractor);
            //LOG.Debug("Successfully obtained a new job for our client and locked it in the database! Sending...");
            response.Extractor.Configuration = responseConfig;

            // now passing the extractor a directory name in which to dump all extractions
            response.Message = this.BatchDirectory;
            // end passing dir name

            /// TBD - maybe provide a start value in the event a vista extraction stopped in the middle of a file and
            /// the extractor
            //try
            //{
            //    FileDao fileDao = new FileDao();
            //    string lastFileIen = fileDao.getLastIen(response.Configuration.SiteCode, response.Configuration.VistaFile);
            //    int lastIen = Convert.ToInt32(lastFileIen);
            //    if (lastIen > 0)
            //    {
            //        response.Extractor.
            //    }
            //}
            //    catch (Exception exc)
            //    {

            //    }

            return(response);
        }
コード例 #29
0
        public MessageTO getJobCompletedResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.JobCompletedResponse;

            if (request == null || String.IsNullOrEmpty(request.Configuration.SiteCode) ||
                String.IsNullOrEmpty(request.Configuration.QueryConfigurations.RootNode.Value.File))
            {
                //LOG.Debug("Received an invalid job completed request from the client - unable to process: " + request.Configuration.ToString());
                logging.Log.LOG("Problem with job complete request!");
                response.MessageType = MessageTypeTO.Error;
                response.Error       = "Invalid request!";
                return(response);
            }

            try
            {
                String  sqlProvider      = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlProvider];
                String  connectionString = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlConnectionString];
                ISqlDao sqlDao           = new SqlDaoFactory().getSqlDao(new SqlConnectionFactory().getConnection(sqlProvider, connectionString));
                if (request.ExtractorReport != null)
                {
                    try
                    {
                        logging.Log.LOG("Saving successful job report...");
                        sqlDao.saveReport(request.ExtractorReport);
                    }
                    catch (Exception exc)
                    {
                        logging.Log.LOG("Unable to save extractors report: " + request.Configuration.SiteCode + " - " + request.Configuration.QueryConfigurations.RootNode.Value.File + ", " + exc.Message);
                    }
                }
                // get last IEN from message and save to tracking table
                sqlDao.saveLastIen(request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File, request.ExtractorReport.StartIen, request.ExtractorReport.LastIen, request.ExtractorReport.BatchId);
                // unlock site from locks table
                sqlDao.unlockSite(request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File);
                // the remove function keys off the site code and vista file - those are the only params we need
                Extractors.Remove(new Extractor("", 0, request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File, DateTime.Now));
                CompletedExtractions.Push(request.Configuration);
                ActiveExtractions.Remove(request.Configuration);
                // all done with site?
                try
                {
                    checkSiteCompleteAndTrigger(request.ExtractorReport.BatchId, request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File);
                }
                catch (Exception triggerExc) // shouldn't fail job complete request if there is a problem with this - we just won't create the trigger
                {
                    logging.Log.LOG("An unexpected error occured when checking if it was ok to create the trigger for site " + request.Configuration.SiteCode + "\r\n\r\n" + triggerExc.ToString());
                }
                response.Message = "Nice Work!";
            }
            catch (Exception exc)
            {
                logging.Log.LOG(exc.Message);
                response.MessageType = MessageTypeTO.Error;
                response.Error       = exc.ToString();
            }

            // handle post process in separate thread
            Thread postProcessThread = new Thread(new ParameterizedThreadStart(RequestHandler.getInstance().postProcess));

            postProcessThread.Start(request);

            return(response);
        }
コード例 #30
0
        public MessageTO getJobErrorResponse(MessageTO request)
        {
            MessageTO response = new MessageTO();

            response.MessageType = MessageTypeTO.JobErrorResponse;
            if (request == null || request.Configuration == null || !request.Configuration.isCompleteConfiguration())
            {
                response.MessageType = MessageTypeTO.Error;
                response.Error       = "Incomplete ExtractorConfiguration parameter on request";
                logging.Log.LOG("The ExtractorConfiguration object sent to the job error request handler is incomplete! Unable to process request");
                //LOG.Error("The ExtractorConfiguration object sent to the job error request handler is incomplete! Unable to process request: " + request.Configuration.ToString());
                return(response);
            }
            if (WorkStack == null)
            {
                logging.Log.LOG("The work stack is null for the job error request. Was everything setup correctly?");
                //LOG.Debug("The work stack is null - was everything set up correctly?");
                response.MessageType = MessageTypeTO.Error;
                response.Error       = "WorkStack has not been initialized";
                return(response);
            }

            // the remove function keys off the site code and vista file - those are the only params we need
            Extractors.Remove(new Extractor("", 0, request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File, DateTime.Now));
            ActiveExtractions.Remove(request.Configuration);
            ErroredExtractions.Push(request.Configuration);

            // bug fix: some edge cases will allow duplicate configs to be added to stack - need to check not already there
            //bool alreadyOnStack = false;
            //if (WorkStack.Contains(request.Configuration))
            //{
            //    //LOG.Debug("It looks like this job was already on the stack - no need to add it again");
            //    alreadyOnStack = true;
            //}
            // decided to temporarily stop adding errored jobs back to the stack to check for patterns in error site codes
            //if (!alreadyOnStack)
            //{
            //    LOG.Debug("Adding a job back to the work stack since the client reported an error while processing");
            //    ErroredExtractions.Push(request.Configuration);
            //    ActiveExtractions.Remove(request.Configuration);
            //    WorkStack.Push(request.Configuration);
            //}
            // end bug fix

            try
            {
                String  sqlProvider      = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlProvider];
                String  connectionString = ConfigurationManager.AppSettings[config.AppConfigSettingsConstants.SqlConnectionString];
                ISqlDao sqlDao           = new SqlDaoFactory().getSqlDao(new SqlConnectionFactory().getConnection(sqlProvider, connectionString));
                if (request.ExtractorReport != null)
                {
                    try
                    {
                        logging.Log.LOG("Saving error report...");
                        sqlDao.saveReport(request.ExtractorReport);
                    }
                    catch (Exception exc)
                    {
                        //LOG.Error("Unable to save an extractor's report!", exc);
                    }
                }
                sqlDao.unlockSite(request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File);
                //LOG.Debug("Successfully unlocked job so another client can process");

                // should check site completion on job error reports too
                try
                {
                    checkSiteCompleteAndTrigger(request.ExtractorReport.BatchId, request.Configuration.SiteCode, request.Configuration.QueryConfigurations.RootNode.Value.File);
                }
                catch (Exception te)
                { /* problems with trigger file shouldn't effect extractor */
                    logging.Log.LOG("An error occured when checking trigger file creation criteria: " + te.ToString());
                }
            }
            catch (Exception exc)
            {
                logging.Log.LOG("The call to unlock the extraction job for site " + request.Configuration.SiteCode +
                                ", file " + request.Configuration.QueryConfigurations.RootNode.Value.File + " has failed unexpectedly");
                logging.Log.LOG(exc.Message);

                response.MessageType = MessageTypeTO.Error;
                response.Error       = exc.ToString();
                return(response);
            }
            return(response);
        }