private Set <EventHandlerInfo> selectEventHandlers(Type eventType, EntityRef entity)
        {
            Set <EventHandlerInfo> result = Sets.newHashSet();

            result.addAll(generalHandlers.get(eventType));
            SetMultimap <Type, EventHandlerInfo> handlers = componentSpecificHandlers[eventType];

            if (handlers == null)
            {
                return(result);
            }

            foreach (Type compClass in handlers.Keys)
            {
                if (entity.hasComponent(compClass))
                {
                    foreach (EventHandlerInfo eventHandler in handlers.get(compClass))
                    {
                        if (eventHandler.isValidFor(entity))
                        {
                            result.add(eventHandler);
                        }
                    }
                }
            }
            return(result);
        }
        private void addToComponentSpecificHandlers(Type type, EventHandlerInfo handlerInfo, Type c)
        {
            SetMultimap <Type, EventHandlerInfo> componentMap = componentSpecificHandlers[type];

            if (componentMap == null)
            {
                componentMap = HashMultimap.create();
                componentSpecificHandlers[type] = componentMap;
            }
            componentMap.put(c, handlerInfo);
        }
        public virtual void unregisterEventReceiver <T>(EventReceiver <T> eventReceiver, Type eventClass, params Type[] componentTypes) where T : [email protected]
        {
            SetMultimap <Type, EventHandlerInfo> eventHandlerMap = componentSpecificHandlers[eventClass];

            if (eventHandlerMap != null)
            {
                ReceiverEventHandlerInfo testReceiver = new ReceiverEventHandlerInfo <T>(eventReceiver, 0, componentTypes);
                foreach (Type c in componentTypes)
                {
                    eventHandlerMap.remove(c, testReceiver);
                    foreach (Type childType in childEvents.get(eventClass))
                    {
                        eventHandlerMap.remove(childType, testReceiver);
                    }
                }
            }
        }
        /// <summary>
        /// Obtains a generator from an existing provider and definition.
        /// </summary>
        /// <param name="knownProvider">  the underlying known provider </param>
        /// <param name="groupDefn">  the curve group definition </param>
        /// <param name="refData">  the reference data to use </param>
        /// <returns> the generator </returns>
        public static ImmutableRatesProviderGenerator of(ImmutableRatesProvider knownProvider, RatesCurveGroupDefinition groupDefn, ReferenceData refData)
        {
            IList <CurveDefinition>           curveDefns    = new List <CurveDefinition>();
            IList <CurveMetadata>             curveMetadata = new List <CurveMetadata>();
            SetMultimap <CurveName, Currency> discountNames = HashMultimap.create();
            SetMultimap <CurveName, Index>    indexNames    = HashMultimap.create();

            foreach (CurveDefinition curveDefn in groupDefn.CurveDefinitions)
            {
                curveDefns.Add(curveDefn);
                curveMetadata.Add(curveDefn.metadata(knownProvider.ValuationDate, refData));
                CurveName curveName = curveDefn.Name;
                // A curve group is guaranteed to include an entry for every definition
                RatesCurveGroupEntry entry = groupDefn.findEntry(curveName).get();
                ISet <Currency>      ccy   = entry.DiscountCurrencies;
                discountNames.putAll(curveName, ccy);
                indexNames.putAll(curveName, entry.Indices);
            }
            return(new ImmutableRatesProviderGenerator(knownProvider, curveDefns, curveMetadata, discountNames, indexNames));
        }
 public virtual void send(EntityRef entity, Event @event, Component component)
 {
     if (Thread.CurrentThread != mainThread)
     {
         pendingEvents.offer(new PendingEvent(entity, @event, component));
     }
     else
     {
         SetMultimap <Type, EventHandlerInfo> handlers = componentSpecificHandlers[@event.GetType()];
         if (handlers != null)
         {
             IList <EventHandlerInfo> eventHandlers = Lists.newArrayList(handlers.get(component.GetType()));
             eventHandlers.Sort(priorityComparator);
             foreach (EventHandlerInfo eventHandler in eventHandlers)
             {
                 if (eventHandler.isValidFor(entity))
                 {
                     eventHandler.invoke(entity, @event);
                 }
             }
         }
     }
 }
 /// <summary>
 /// Creates an instance.
 /// </summary>
 /// <param name="knownProvider">  the underlying known provider </param>
 /// <param name="curveDefinitions">  the curve definitions </param>
 /// <param name="curveMetadata">  the curve metadata </param>
 /// <param name="discountCurveNames">  the map of discount curves </param>
 /// <param name="forwardCurveNames">  the map of index forward curves </param>
 private ImmutableRatesProviderGenerator(ImmutableRatesProvider knownProvider, IList <CurveDefinition> curveDefinitions, IList <CurveMetadata> curveMetadata, SetMultimap <CurveName, Currency> discountCurveNames, SetMultimap <CurveName, Index> forwardCurveNames)
 {
     this.knownProvider      = ArgChecker.notNull(knownProvider, "knownProvider");
     this.curveDefinitions   = ImmutableList.copyOf(ArgChecker.notNull(curveDefinitions, "curveDefinitions"));
     this.curveMetadata      = ImmutableList.copyOf(ArgChecker.notNull(curveMetadata, "curveMetadata"));
     this.discountCurveNames = ImmutableSetMultimap.copyOf(ArgChecker.notNull(discountCurveNames, "discountCurveNames"));
     this.forwardCurveNames  = ImmutableSetMultimap.copyOf(ArgChecker.notNull(forwardCurveNames, "forwardCurveNames"));
 }