コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        public Variable GetVariableMetaData(
            string deploymentId,
            string variableName)
        {
            var entry = DeploymentsWithVariables.Get(deploymentId);

            return entry?.GetVariable(variableName);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }