public void UnregisterCallback( string deploymentId, string variableName, int agentInstanceId, VariableChangeCallback variableChangeCallback) { var entry = DeploymentsWithVariables.Get(deploymentId); var variable = entry?.GetVariable(variableName); if (variable == null) { return; } var cps = changeCallbacksPerCP[variable.VariableNumber]; if (cps == null) { return; } if (variable.MetaData.OptionalContextName == null) { agentInstanceId = 0; } var callbacks = cps.Get(agentInstanceId); callbacks?.Remove(variableChangeCallback); }
public void RegisterCallback( string deploymentId, string variableName, int agentInstanceId, VariableChangeCallback variableChangeCallback) { var entry = DeploymentsWithVariables.Get(deploymentId); var variable = entry?.GetVariable(variableName); if (variable == null) { return; } var cps = changeCallbacksPerCP[variable.VariableNumber]; if (cps == null) { cps = new Dictionary<int, ICollection<VariableChangeCallback>>(); changeCallbacksPerCP[variable.VariableNumber] = cps; } if (variable.MetaData.OptionalContextName == null) { agentInstanceId = DEFAULT_AGENT_INSTANCE_ID; } var callbacks = cps.Get(agentInstanceId); if (callbacks == null) { callbacks = new CopyOnWriteArraySet<VariableChangeCallback>(); cps.Put(agentInstanceId, callbacks); } callbacks.Add(variableChangeCallback); }
public Variable GetVariableMetaData( string deploymentId, string variableName) { var entry = DeploymentsWithVariables.Get(deploymentId); return entry?.GetVariable(variableName); }
public VariableReader GetReader( string deploymentId, string variableName, int agentInstanceIdAccessor) { var entry = DeploymentsWithVariables.Get(deploymentId); var variable = entry?.GetVariable(variableName); if (variable == null) { return null; } IDictionary<int, VariableReader> cps = variableVersionsPerCP[variable.VariableNumber]; if (variable.MetaData.OptionalContextName == null) { return cps.Get(DEFAULT_AGENT_INSTANCE_ID); } return cps.Get(agentInstanceIdAccessor); }
public void DeallocateVariableState( string deploymentId, string variableName, int agentInstanceId) { var entry = DeploymentsWithVariables.Get(deploymentId); if (entry == null) { throw new ArgumentException("Failed to find variable deployment id '" + deploymentId + "'"); } var variable = entry.GetVariable(variableName); if (variable == null) { throw new ArgumentException("Failed to find variable '" + variableName + "'"); } IDictionary<int, VariableReader> cps = variableVersionsPerCP[variable.VariableNumber]; cps.Remove(agentInstanceId); if (OptionalStateHandler != null && !variable.MetaData.IsConstant) { OptionalStateHandler.RemoveState(variable, agentInstanceId); } }
public void CheckAndWrite( string deploymentId, string variableName, int agentInstanceId, object newValue) { var entry = DeploymentsWithVariables.Get(deploymentId); if (entry == null) { throw new ArgumentException("Failed to find variable deployment id '" + deploymentId + "'"); } var variable = entry.GetVariable(variableName); var variableNumber = variable.VariableNumber; if (newValue == null) { Write(variableNumber, agentInstanceId, null); return; } var valueType = newValue.GetType(); if (variable.MetaData.EventType != null) { if (!TypeHelper.IsSubclassOrImplementsInterface( newValue.GetType(), variable.MetaData.EventType.UnderlyingType)) { throw new VariableValueException( "Variable '" + variableName + "' of declared event type '" + variable.MetaData.EventType.Name + "' underlying type '" + variable.MetaData.EventType.UnderlyingType.CleanName() + "' cannot be assigned a value of type '" + valueType.Name + "'"); } var eventBean = eventBeanTypedEventFactory.AdapterForTypedObject(newValue, variable.MetaData.EventType); Write(variableNumber, agentInstanceId, eventBean); return; } var variableType = variable.MetaData.Type; if (valueType.Equals(variableType) || variableType == typeof(object)) { Write(variableNumber, agentInstanceId, newValue); return; } if (TypeHelper.IsSubclassOrImplementsInterface(valueType, variableType)) { Write(variableNumber, agentInstanceId, newValue); return; } if (!variableType.IsNumeric() || !valueType.IsNumeric()) { throw new VariableValueException( VariableUtil.GetAssigmentExMessage(variableName, variableType, valueType)); } // determine if the expression type can be assigned if (!valueType.CanCoerce(variableType)) { throw new VariableValueException( VariableUtil.GetAssigmentExMessage(variableName, variableType, valueType)); } var valueCoerced = TypeHelper.CoerceBoxed(newValue, variableType); Write(variableNumber, agentInstanceId, valueCoerced); }
public void AllocateVariableState( string deploymentId, string variableName, int agentInstanceId, bool recovery, NullableObject<object> initialValue, EventBeanTypedEventFactory eventBeanTypedEventFactory) { var entry = DeploymentsWithVariables.Get(deploymentId); if (entry == null) { throw new ArgumentException("Failed to find variable deployment id '" + deploymentId + "'"); } var variable = entry.GetVariable(variableName); if (variable == null) { throw new ArgumentException("Failed to find variable '" + variableName + "'"); } // Check current state - see if the variable exists in the state handler object initialState; if (initialValue != null) { initialState = initialValue.Value; } else { initialState = variable.MetaData.ValueWhenAvailable; } if (variable.MetaData.EventType != null && initialState != null && !(initialState is EventBean)) { initialState = eventBeanTypedEventFactory.AdapterForTypedObject( initialState, variable.MetaData.EventType); } if (OptionalStateHandler != null && !variable.MetaData.IsConstant) { var priorValue = OptionalStateHandler.GetHasState(variable, agentInstanceId); if (recovery) { if (priorValue != null) { initialState = priorValue.Value; } } else { if (priorValue == null) { // we do not already have a value OptionalStateHandler.SetState(variable, agentInstanceId, initialState); } else { initialState = priorValue.Value; } } } // create new holder for versions var timestamp = timeProvider.Time; var valuePerVersion = new VersionedValueList<object>( variableName, currentVersionNumber, initialState, timestamp, millisecondLifetimeOldVersions, ReadWriteLock.ReadLock, HIGH_WATERMARK_VERSIONS, false); IDictionary<int, VariableReader> cps = variableVersionsPerCP[variable.VariableNumber]; var reader = new VariableReader(variable, versionThreadLocal, valuePerVersion); cps.Put(agentInstanceId, reader); }