Example #1
0
        /// <summary>The return value from executing the Erlang RPC.</summary>
        /// <param name="module">The module to call</param>
        /// <param name="function">The function to invoke</param>
        /// <param name="erlangObject">The erlang object that is passed in as a parameter</param>
        /// <returns>The converted .NET object return value from the RPC call.</returns>
        /// <exception cref="ErlangConversionException">in case of conversion failures</exception>
        public override object FromErlangRpc(string module, string function, OtpErlangObject erlangObject)
        {
            var converter = this.GetConverter(module, function);

            if (converter != null)
            {
                return(converter.FromErlang(erlangObject));
            }
            else
            {
                return(base.FromErlangRpc(module, function, erlangObject));
            }
        }
Example #2
0
        /// <summary>Extracts the string.</summary>
        /// <param name="obj">The obj.</param>
        /// <returns>The string.</returns>
        private string ExtractString(OtpErlangObject obj)
        {
            if (obj is OtpErlangBinary)
            {
                var binary = (OtpErlangBinary)obj;
                return(new UTF8Encoding().GetString(binary.binaryValue()));
            }
            else if (obj is OtpErlangTuple)
            {
                var tuple = (OtpErlangTuple)obj;
                return(this.ExtractString(tuple.elementAt(0)));
            }

            return(null);
        }
Example #3
0
        /// <summary>Convert from an Erlang data type to a .NET data type.</summary>
        /// <param name="erlangObject">The erlang object.</param>
        /// <returns>The converted .NET object</returns>
        /// <exception cref="ErlangConversionException">in case of conversion failures</exception>
        public override object FromErlang(OtpErlangObject erlangObject)
        {
            var applications = new List <Application>();
            var nodes        = new List <Node>();
            var runningNodes = new List <Node>();

            if (erlangObject is OtpErlangList)
            {
                var erlangList = (OtpErlangList)erlangObject;

                var runningAppTuple = (OtpErlangTuple)erlangList.elementAt(1);
                var appList         = (OtpErlangList)runningAppTuple.elementAt(1);
                this.ExtractApplications(applications, appList);
            }

            return(new RabbitStatus(applications, nodes, runningNodes));
        }
Example #4
0
        /// <summary>Convert from an Erlang data type to a .NET data type.</summary>
        /// <param name="erlangObject">The erlang object.</param>
        /// <returns>The converted .NET object</returns>
        /// <exception cref="ErlangConversionException">in case of conversion failures</exception>
        public override object FromErlang(OtpErlangObject erlangObject)
        {
            var users = new List <string>();

            if (erlangObject is OtpErlangList)
            {
                var erlangList = (OtpErlangList)erlangObject;
                foreach (var obj in erlangList)
                {
                    if (obj is OtpErlangList)
                    {
                        var value = this.ExtractString(((OtpErlangTuple)((OtpErlangList)obj).elementAt(0)).elementAt(1));
                        if (value != null)
                        {
                            users.Add(value);
                        }
                    }
                }
            }

            return(users);
        }
        /// <summary>Handles the response error.</summary>
        /// <param name="module">The module.</param>
        /// <param name="function">The function.</param>
        /// <param name="result">The result.</param>
        public void HandleResponseError(string module, string function, OtpErlangObject result)
        {
            /* {badrpc,{'EXIT',{undef,[{rabbit_access_control,list_users,[[]]},{rpc,'-handle_call/3-fun-0-',5}]}}} */
            if (result is OtpErlangTuple)
            {
                var msg = (OtpErlangTuple)result;
                if (msg.elementAt(0) is OtpErlangAtom)
                {
                    var responseAtom = (OtpErlangAtom)msg.elementAt(0);

                    // TODO: consider error handler strategy.
                    if (responseAtom.atomValue().Equals("badrpc"))
                    {
                        if (msg.elementAt(1) is OtpErlangTuple)
                        {
                            throw new ErlangBadRpcException((OtpErlangTuple)msg.elementAt(1));
                        }
                        else
                        {
                            throw new ErlangBadRpcException(msg.elementAt(1).ToString());
                        }
                    }
                    else if (responseAtom.atomValue().Equals("error"))
                    {
                        if (msg.elementAt(1) is OtpErlangTuple)
                        {
                            throw new ErlangErrorRpcException((OtpErlangTuple)msg.elementAt(1));
                        }
                        else
                        {
                            throw new ErlangErrorRpcException(msg.elementAt(1).ToString());
                        }
                    }
                }
            }
        }
 /// <summary>The return value from executing the Erlang RPC.</summary>
 /// <param name="module">The module to call</param>
 /// <param name="function">The function to invoke</param>
 /// <param name="erlangObject">The erlang object that is passed in as a parameter</param>
 /// <returns>The converted .NET object return value from the RPC call.</returns>
 /// <exception cref="ErlangConversionException">in case of conversion failures</exception>
 public virtual object FromErlangRpc(string module, string function, OtpErlangObject erlangObject)
 {
     return(this.FromErlang(erlangObject));
 }
 /// <summary>Convert from an Erlang data type to a .NET data type.</summary>
 /// <param name="erlangObject">The erlang object.</param>
 /// <returns>The converted .NET object</returns>
 /// <exception cref="ErlangConversionException">in case of conversion failures</exception>
 public virtual object FromErlang(OtpErlangObject erlangObject)
 {
     // TODO: support arrays
     return(this.ConvertErlangToBasicType(erlangObject));
 }
 /// <summary>Extracts the long.</summary>
 /// <param name="value">The value.</param>
 /// <returns>The long.</returns>
 public static long ExtractLong(OtpErlangObject value)
 {
     return(((OtpErlangLong)value).longValue());
 }
 /// <summary>The extract pid.</summary>
 /// <param name="value">The value.</param>
 /// <returns>The System.String.</returns>
 public static string ExtractPid(OtpErlangObject value)
 {
     return(value.ToString());
 }
 /// <summary>Extracts the boolean.</summary>
 /// <param name="erlangObject">The erlang object.</param>
 /// <returns>The boolean.</returns>
 public static bool ExtractBoolean(OtpErlangObject erlangObject)
 {
     // TODO Erlang.NET has wrong capitilization
     return(((OtpErlangBoolean)erlangObject).boolValue());
 }
 /// <summary>Converts the type of the erlang to basic.</summary>
 /// <param name="erlangObject">The erlang object.</param>
 /// <returns>The object.</returns>
 private object ConvertErlangToBasicType(OtpErlangObject erlangObject)
 {
     try
     {
         if (erlangObject is OtpErlangBinary)
         {
             return(((OtpErlangBinary)erlangObject).binaryValue());
         }
         else if (erlangObject is OtpErlangAtom)
         {
             return(((OtpErlangAtom)erlangObject).atomValue());
         }
         else if (erlangObject is OtpErlangBinary)
         {
             return(((OtpErlangBinary)erlangObject).binaryValue());
         }
         else if (erlangObject is OtpErlangBoolean)
         {
             return(ExtractBoolean(erlangObject));
         }
         else if (erlangObject is OtpErlangByte)
         {
             return(((OtpErlangByte)erlangObject).byteValue());
         }
         else if (erlangObject is OtpErlangChar)
         {
             return(((OtpErlangChar)erlangObject).charValue());
         }
         else if (erlangObject is OtpErlangDouble)
         {
             return(((OtpErlangDouble)erlangObject).doubleValue());
         }
         else if (erlangObject is OtpErlangFloat)
         {
             return(((OtpErlangFloat)erlangObject).floatValue());
         }
         else if (erlangObject is OtpErlangInt)
         {
             return(((OtpErlangInt)erlangObject).intValue());
         }
         else if (erlangObject is OtpErlangLong)
         {
             return(((OtpErlangLong)erlangObject).longValue());
         }
         else if (erlangObject is OtpErlangShort)
         {
             return(((OtpErlangShort)erlangObject).shortValue());
         }
         else if (erlangObject is OtpErlangString)
         {
             return(((OtpErlangString)erlangObject).stringValue());
         }
         else if (erlangObject is OtpErlangPid)
         {
             return(erlangObject.ToString());
         }
         else
         {
             throw new ErlangConversionException(
                       "Could not convert Erlang object ["
                       + erlangObject.GetType() + "] to .NET type.");
         }
     }
     catch (OtpErlangRangeException ex)
     {
         // TODO: Erlang.NET exceptions do not support nesting root exceptions.
         throw new ErlangConversionException(
                   "Could not convert Erlang object [" + erlangObject.GetType()
                   + "] to .NET type.  OtpErlangRangeException msg [" + ex.Message +
                   "]");
     }
 }
Example #12
0
 /// <summary>Extracts the atom boolean.</summary>
 /// <param name="value">The value.</param>
 /// <returns>The atom boolean.</returns>
 private bool ExtractAtomBoolean(OtpErlangObject value)
 {
     return(((OtpErlangAtom)value).boolValue());
 }
Example #13
0
        /// <summary>The from erlang.</summary>
        /// <param name="erlangObject">The erlang object.</param>
        /// <returns>The System.Object.</returns>
        public override object FromErlang(OtpErlangObject erlangObject)
        {
            var queueInfoList = new List <QueueInfo>();

            if (erlangObject is OtpErlangList)
            {
                var erlangList = (OtpErlangList)erlangObject;
                foreach (var element in erlangList)
                {
                    var queueInfo = new QueueInfo();
                    var itemList  = (OtpErlangList)element;
                    foreach (var item in itemList)
                    {
                        var tuple = (OtpErlangTuple)item;
                        if (tuple.arity() == 2)
                        {
                            var key   = tuple.elementAt(0).ToString();
                            var value = tuple.elementAt(1);
                            switch (ToQueueInfoField(key))
                            {
                            case QueueInfoField.name:
                                queueInfo.Name = this.ExtractNameValueFromTuple((OtpErlangTuple)value);
                                break;

                            case QueueInfoField.transactions:
                                queueInfo.Transactions = ExtractLong(value);
                                break;

                            case QueueInfoField.acks_uncommitted:
                                queueInfo.AcksUncommitted = ExtractLong(value);
                                break;

                            case QueueInfoField.consumers:
                                queueInfo.Consumers = ExtractLong(value);
                                break;

                            case QueueInfoField.pid:
                                queueInfo.Pid = ExtractPid(value);
                                break;

                            case QueueInfoField.durable:
                                queueInfo.Durable = this.ExtractAtomBoolean(value);
                                break;

                            case QueueInfoField.messages:
                                queueInfo.Messages = ExtractLong(value);
                                break;

                            case QueueInfoField.memory:
                                queueInfo.Memory = ExtractLong(value);
                                break;

                            case QueueInfoField.auto_delete:
                                queueInfo.AutoDelete = this.ExtractAtomBoolean(value);
                                break;

                            case QueueInfoField.messages_ready:
                                queueInfo.MessagesReady = ExtractLong(value);
                                break;

                            case QueueInfoField.arguments:
                                var list = (OtpErlangList)value;
                                if (list != null)
                                {
                                    var args = new string[list.arity()];
                                    for (var i = 0; i < list.arity(); i++)
                                    {
                                        var obj = list.elementAt(i);
                                        args[i] = obj.ToString();
                                    }

                                    queueInfo.Arguments = args;
                                }

                                break;

                            case QueueInfoField.messages_unacknowledged:
                                queueInfo.MessagesUnacknowledged = ExtractLong(value);
                                break;

                            case QueueInfoField.messages_uncommitted:
                                queueInfo.MessageUncommitted = ExtractLong(value);
                                break;

                            default:
                                break;
                            }
                        }
                    }

                    queueInfoList.Add(queueInfo);
                }
            }

            return(queueInfoList);
        }