public static bool CheckAndPrepare(ModelContainer mc) { //preFill predefined indices mc.PrefillPredefinedIndices(Enum.GetValues(typeof(ID))); HashSet <string> alreadyDefinedAppIds = new HashSet <string>(); SensactApplicationContainer masterApp = new SensactApplicationContainer() { Application = new Applications.MasterApplication(), Index = mc.GetIndex("MASTER"), Node = null }; mc.id2app[masterApp.Application.ApplicationId] = masterApp; mc.index2app[0] = masterApp; foreach (Node n in mc.Model.Nodes) { n.Applications.Add(new SensactNodeApplication { ApplicationId = n.Id, }); HashSet <string> usedInputPins = new HashSet <string>(); HashSet <string> usedOutputPins = new HashSet <string>(); foreach (SensactApplication app in n.Applications) { if (alreadyDefinedAppIds.Contains(app.ApplicationId)) { LOG.ErrorFormat("AppId {0} is defined at least two times in node applications", app.ApplicationId); return(false); } if (!app.HasValidAppId()) { LOG.WarnFormat("AppId {0} does not fulfill the recommendations for application name. This is ok, but maybe it is an error...", app.ApplicationId, n.Id); app.HasValidAppId(); } string errorMessage = app.CheckAndAddUsedPins(usedInputPins, usedOutputPins); if (errorMessage != null) { LOG.ErrorFormat("AppId {0} uses pins that have been reserved by another app:\n{1}", app.ApplicationId, errorMessage); return(false); } alreadyDefinedAppIds.Add(app.ApplicationId); SensactApplicationContainer cont = new SensactApplicationContainer { Application = app, Index = mc.GetIndex(app.ApplicationId), Node = n, }; mc.id2app[cont.Application.ApplicationId] = cont; mc.index2app[cont.Index] = cont; } } //Find out which events should be fired by each application because there is a listener for the event //distinguish between local events and bus events foreach (Node n in mc.Model.Nodes) { foreach (SensactApplication app in n.Applications) { HashSet <Event> evts = app.IReactOnTheseEvents(); SensactApplicationContainer appCont = mc.id2app[app.ApplicationId]; foreach (Event evt in evts) { //Kann die SourceApp dieses Event überhaupt erzeugen? SensactApplicationContainer source; if (!mc.id2app.TryGetValue(evt.SourceAppId, out source)) { LOG.ErrorFormat("AppId {0} listens to event from AppId {1}, but this app does not exist.", app.ApplicationId, evt.SourceAppId); return(false); } else { if (!source.Application.ICanSendTheseEvents().Contains(evt.EventType)) { LOG.ErrorFormat("AppId {0} listens to event {1} from AppId {2}, but this app cannot produce such events.", app.ApplicationId, evt.EventType, evt.SourceAppId); return(false); } } if (appCont.Node == source.Node) { //source und destination leben in der selben node HashSet <EventType> set = null; if (!mc.id2localEvents.TryGetValue(evt.SourceAppId, out set)) { set = new HashSet <EventType>(); mc.id2localEvents[evt.SourceAppId] = set; } set.Add(evt.EventType); } else { HashSet <EventType> set = null; if (!mc.id2busEvents.TryGetValue(evt.SourceAppId, out set)) { set = new HashSet <EventType>(); mc.id2busEvents[evt.SourceAppId] = set; } set.Add(evt.EventType); } } HashSet <Command> cmds = app.ISendTheseCommands(); foreach (Command cmd in cmds) { SensactApplicationContainer target; if (!mc.id2app.TryGetValue(cmd.TargetAppId, out target)) { if (cmd.TargetAppId != ID.NO_APPLICATION.ToString()) { LOG.ErrorFormat("AppId {0} sends command to AppId {1}, but this app does not exist.", app.ApplicationId, cmd.TargetAppId); return(false); } } else { if (!target.Application.ICanReactOnTheseCommands().Contains(cmd.CommandType)) { LOG.ErrorFormat("AppId {0} sends command {1} to AppId {2}, but this app cannot react on this command.", app.ApplicationId, cmd.CommandType, cmd.TargetAppId); return(false); } } } } } return(true); }