public void CloseProcesses() { lock (stateList) { foreach (ISubscriberService service in subscriberTable.Values) { try { service.ForceCrash(); } catch (Exception) { } } foreach (IPublisherService service in publisherTable.Values) { try { service.ForceCrash(); } catch (Exception) { } } foreach (IMessageBrokerService service in brokerTable.Values) { try { service.ForceCrash(); } catch (Exception) { } } routingPolicy = RoutingPolicyType.FLOOD; ordering = OrderingType.FIFO; loggingLevel = LoggingLevelType.LIGHT; brokerTable = new Dictionary <String, IMessageBrokerService>(); publisherTable = new Dictionary <String, IPublisherService>(); subscriberTable = new Dictionary <String, ISubscriberService>(); stateList = new Dictionary <String, ProcessState>(); } }
///<summary> /// Puppet Master CLI constructor ///</summary> internal PuppetMaster() { routingPolicy = RoutingPolicyType.FLOOD; ordering = OrderingType.FIFO; loggingLevel = LoggingLevelType.LIGHT; siteTable = new Dictionary <String, Site>(); puppetMasterServiceTable = new Dictionary <String, IPuppetMasterService>(); brokerResolutionCache = new Dictionary <String, String>(); publisherResolutionCache = new Dictionary <String, String>(); subscriberResolutionCache = new Dictionary <String, String>(); }
///<summary> /// Puppet Master Service constructor ///</summary> public PuppetMasterService(String newServiceName, int newPort) { serviceName = newServiceName; serviceURL = "tcp://localhost:" + newPort + "/" + newServiceName; port = newPort; routingPolicy = RoutingPolicyType.FLOOD; ordering = OrderingType.FIFO; loggingLevel = LoggingLevelType.LIGHT; brokerTable = new Dictionary <String, IMessageBrokerService>(); publisherTable = new Dictionary <String, IPublisherService>(); subscriberTable = new Dictionary <String, ISubscriberService>(); stateList = new Dictionary <String, ProcessState>(); BROKERFILE = "MessageBroker.exe"; PUBLISHERFILE = "Publisher.exe"; SUBSCRIBERFILE = "Subscriber.exe"; }
//<summary> // Close processes //</summary> internal void CloseProcesses() { foreach (IPuppetMasterService service in puppetMasterServiceTable.Values) { try { service.CloseProcesses(); } catch (Exception) { } } routingPolicy = RoutingPolicyType.FLOOD; ordering = OrderingType.FIFO; loggingLevel = LoggingLevelType.LIGHT; siteTable = new Dictionary <String, Site>(); puppetMasterServiceTable = new Dictionary <String, IPuppetMasterService>(); brokerResolutionCache = new Dictionary <String, String>(); publisherResolutionCache = new Dictionary <String, String>(); subscriberResolutionCache = new Dictionary <String, String>(); }
//<summary> // Converts string input into command //</summary> private void ParseLineToCommand(String line) { int waitingTime; String serviceURL; String[] fields = line.Split(' '); String command = fields[0].ToLower(); if (fields.Length == 2 && command.Equals("wait") && Int32.TryParse(fields[1], out waitingTime)) { Thread.Sleep(waitingTime); } else if (fields.Length == 4 && command.Equals("site") && fields[2].ToLower().Equals("parent")) { Site parentSite; siteTable.TryGetValue(fields[3], out parentSite); siteTable.Add(fields[1], new Site(fields[1], parentSite)); } else if (fields.Length == 1 && command.Equals("status")) { foreach (IPuppetMasterService service in puppetMasterServiceTable.Values) { service.ExecuteStatusCommand(); } } else if (fields.Length == 2 && command.Equals("crash")) { if (!TryGetServiceURL(fields[1], out serviceURL)) { throw new InvalidProcessServiceException(fields[1]); } puppetMasterServiceTable[serviceURL].ExecuteCrashCommand(fields[1]); } else if (fields.Length == 2 && command.Equals("freeze")) { if (!TryGetServiceURL(fields[1], out serviceURL)) { throw new InvalidProcessServiceException(fields[1]); } puppetMasterServiceTable[serviceURL].ExecuteFreezeCommand(fields[1]); } else if (fields.Length == 2 && command.Equals("unfreeze")) { if (!TryGetServiceURL(fields[1], out serviceURL)) { throw new InvalidProcessServiceException(fields[1]); } puppetMasterServiceTable[serviceURL].ExecuteUnfreezeCommand(fields[1]); } else if (fields.Length == 2 && command.Equals("routingpolicy")) { if (fields[1].ToLower().Equals("flooding")) { routingPolicy = RoutingPolicyType.FLOOD; } else if (fields[1].ToLower().Equals("filter")) { routingPolicy = RoutingPolicyType.FILTER; } else if (fields[1].ToLower().Equals("filtering")) { routingPolicy = RoutingPolicyType.FILTER; } else { throw new InvalidCommandException(command); } foreach (IPuppetMasterService service in puppetMasterServiceTable.Values) { service.RoutingPolicy = routingPolicy; } } else if (fields.Length == 2 && command.Equals("ordering")) { if (fields[1].ToLower().Equals("no")) { ordering = OrderingType.NO_ORDER; } else if (fields[1].ToLower().Equals("fifo")) { ordering = OrderingType.FIFO; } else if (fields[1].ToLower().Equals("total")) { ordering = OrderingType.TOTAL_ORDER; } else { throw new InvalidCommandException(command); } foreach (IPuppetMasterService service in puppetMasterServiceTable.Values) { service.Ordering = ordering; } } else if (fields.Length == 2 && command.Equals("logginglevel")) { if (fields[1].ToLower().Equals("full")) { loggingLevel = LoggingLevelType.FULL; } else if (fields[1].ToLower().Equals("light")) { loggingLevel = LoggingLevelType.LIGHT; } else { throw new InvalidCommandException(command); } foreach (IPuppetMasterService service in puppetMasterServiceTable.Values) { service.LoggingLevel = loggingLevel; } } else if (fields.Length == 4 && command.Equals("subscriber")) { if (!subscriberResolutionCache.TryGetValue(fields[1], out serviceURL)) { throw new InvalidProcessServiceException(fields[1]); } if (fields[2].ToLower().Equals("subscribe")) { puppetMasterServiceTable[serviceURL].ExecuteSubscribeCommand(fields[1], fields[3]); } else if (fields[2].ToLower().Equals("unsubscribe")) { puppetMasterServiceTable[serviceURL].ExecuteUnsubscribeCommand(fields[1], fields[3]); } } else if (fields.Length == 8 && command.Equals("publisher") && fields[2].ToLower().Equals("publish") && fields[4].ToLower().Equals("ontopic") && fields[6].ToLower().Equals("interval")) { int publishTimes = Int32.Parse(fields[3]), intervalTimes = Int32.Parse(fields[7]); if (!publisherResolutionCache.TryGetValue(fields[1], out serviceURL)) { throw new InvalidProcessServiceException(fields[1]); } puppetMasterServiceTable[serviceURL].ExecutePublishCommand( fields[1], publishTimes, fields[5], intervalTimes); } else if (fields.Length == 8 && command.Equals("process") && fields[2].ToLower().Equals("is") && fields[4].ToLower().Equals("on") && fields[6].ToLower().Equals("url") && Regex.IsMatch(fields[7], REGEXURL)) { String processName = fields[1], processType = fields[3], siteName = fields[5], processURL = fields[7]; serviceURL = Regex.Match(processURL, REGEXURL).Groups[1].Value; IPuppetMasterService serviceProxy; Site site; if (!puppetMasterServiceTable.TryGetValue(serviceURL, out serviceProxy)) { serviceProxy = (IPuppetMasterService)Activator.GetObject( typeof(IPuppetMasterService), @"tcp://" + serviceURL + ":" + PORT + "/" + SERVICE_NAME); serviceProxy.RoutingPolicy = routingPolicy; serviceProxy.Ordering = ordering; serviceProxy.LoggingLevel = loggingLevel; puppetMasterServiceTable.Add(serviceURL, serviceProxy); } if (!siteTable.TryGetValue(siteName, out site)) { throw new InvalidSiteException(siteName); } if (processType.ToLower().Equals("broker")) { serviceProxy.ExecuteBrokerCommand( processName, siteName, processURL, site.ParentBrokerURL); brokerResolutionCache.Add(processName, serviceURL); site.BrokerURL = processURL; } else if (processType.ToLower().Equals("publisher")) { serviceProxy.ExecutePublisherCommand( processName, siteName, processURL, site.BrokerURL); publisherResolutionCache.Add(processName, serviceURL); } else if (processType.ToLower().Equals("subscriber")) { serviceProxy.ExecuteSubscriberCommand( processName, siteName, processURL, site.BrokerURL); subscriberResolutionCache.Add(processName, serviceURL); } } else { throw new InvalidCommandException(command); } }