diff options
Diffstat (limited to 'qpid/dotnet/client-010/management/console/QMFObject.cs')
-rw-r--r-- | qpid/dotnet/client-010/management/console/QMFObject.cs | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/qpid/dotnet/client-010/management/console/QMFObject.cs b/qpid/dotnet/client-010/management/console/QMFObject.cs new file mode 100644 index 0000000000..905422efd9 --- /dev/null +++ b/qpid/dotnet/client-010/management/console/QMFObject.cs @@ -0,0 +1,294 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +using System; +using System.Collections.Generic ; +using log4net ; +using org.apache.qpid.transport.codec ; + +namespace org.apache.qpid.console +{ + + /** + * An object which is returned from an agent by the Session. It can have + * methods, properties, and statistics. + */ + public class QMFObject + { + + public static ILog log = LogManager.GetLogger(typeof(QMFObject)) ; + + public Session Session {get;set;} + protected SchemaClass _Schema ; + virtual public SchemaClass Schema {get {return _Schema;} set {_Schema=value;}} + bool Managed ; + public DateTime CurrentTime {get;set;} + public DateTime CreateTime {get;set;} + public DateTime DeleteTime {get;set;} + public ObjectID ObjectID {get;set;} + public Dictionary<string, object> Properties = new Dictionary<string, object>() ; + public Dictionary<string, object> Statistics = new Dictionary<string, object>() ; + + + // This constructor is the "naked" constructor which creates + // an object without a session or a schema. It is used by + // subclasses which are auto generated + public QMFObject() { + } + + public QMFObject(QMFObject source) { + this.Session = source.Session ; + this.Schema = source.Schema ; + this.Managed = source.Managed ; + this.CurrentTime = source.CurrentTime ; + this.CreateTime = source.CreateTime ; + this.DeleteTime = source.DeleteTime ; + this.ObjectID = source.ObjectID ; + this.Properties = source.Properties ; + this.Statistics = source.Statistics ; + } + + // This constructor is used by a session make object call to + // create a blank object from a schema. + public QMFObject(Session session, SchemaClass schema, bool hasProperties, bool hasStats , bool isManaged) { + Session = session ; + Schema = schema ; + Managed = isManaged ; + + if (hasProperties) { + foreach (SchemaProperty prop in Schema.GetAllProperties()) { + object propValue = null ; + if (!prop.Optional) { + propValue = Util.DefaultValue(prop.Type) ; + } + this.SetProperty(prop.Name, propValue) ; + } + } + + if (hasStats) { + foreach (SchemaStatistic stat in Schema.Statistics) { + SetStatistic(stat.Name, Util.DefaultValue(stat.Type)) ; + } + } + } + + // This constructor is used by the session to create an object based on a data + // stream by the agent. + public QMFObject(Session session, SchemaClass schema, IDecoder dec, bool hasProperties, bool hasStats , bool isManaged) + { + Session = session ; + Schema = schema ; + Managed = isManaged ; + + if (Managed) { + // FIXME DateTime or Uint64?? + CurrentTime = new DateTime(dec.ReadDatetime()) ; + CreateTime = new DateTime(dec.ReadDatetime()) ; + DeleteTime = new DateTime(dec.ReadDatetime()) ; + ObjectID = new ObjectID(dec) ; + } + + if (hasProperties) { + List<string> excluded = ProcessPresenceMasks(dec, Schema) ; + + foreach (SchemaProperty prop in Schema.GetAllProperties()) { + if (excluded.Contains(prop.Name)) { + log.Debug(String.Format("Setting Property Default {0}", prop.Name)) ; + safeAddProperty(prop.Name, null) ; + } else { + //log.Debug(String.Format("Setting Property {0}", prop.Name)) ; + safeAddProperty(prop.Name, session.DecodeValue(dec, prop.Type)) ; + } + } + } + + if (hasStats) { + foreach (SchemaStatistic stat in Schema.GetAllStatistics()) { + //log.Debug(String.Format("Setting Statistic {0}", stat.Name)) ; + Statistics.Add(stat.Name, session.DecodeValue(dec, stat.Type)) ; + } + } + + } + + protected List<string> ProcessPresenceMasks(IDecoder dec, SchemaClass schema) { + List<string> excludes = new List<string> () ; + short bit = 0 ; + short mask = 0 ; + foreach (SchemaProperty prop in Schema.GetAllProperties()) { + if (prop.Optional) { + //log.Debug(String.Format("Property named {0} is optional", prop.Name)) ; + if (bit == 0) { + mask=dec.ReadUint8() ; + bit = 1 ; + } + + if ((mask & bit) == 0) { + //log.Debug(String.Format("Property named {0} is not present", prop.Name)) ; + excludes.Add(prop.Name) ; + } + bit *= 2 ; + if (bit == 256) { + bit = 0 ; + } + } + } + return excludes ; + } + + protected List<SchemaMethod> getMethods() { + return Schema.GetAllMethods() ; + } + + public object GetProperty(string attributeName) { + //FIXME any object refs? + object returnValue = null ; + Properties.TryGetValue(attributeName, out returnValue) ; + return returnValue ; + } + + protected void SetStatistic(string attributeName, object newValue) { + Statistics.Remove(attributeName) ; + Statistics.Add(attributeName, newValue) ; + } + + public void SetProperty(string attributeName, object newValue) { + Properties.Remove(attributeName) ; + Properties.Add(attributeName, newValue) ; + } + + public bool IsDeleted() { + return !DeleteTime.Equals(new DateTime(0)) ; + } + + public string RoutingKey() { + return ObjectID.RoutingCode() ; + } + + public long AgentBank() { + return ObjectID.AgentBank() ; + } + + public long BrokerBank() { + return ObjectID.BrokerBank() ; + } + + override public string ToString() { + string propertyString = "" ; + foreach (KeyValuePair<string, object> pair in Properties) { + propertyString = propertyString + String.Format("(Name: '{0}' Value: '{1}')", pair.Key, pair.Value) ; + } + + string statsString = "" ; + foreach (KeyValuePair<string, object> sPair in Statistics) { + statsString = statsString + String.Format("(Name: '{0}' Value: '{1}')", sPair.Key, sPair.Value) ; + } + if (Managed) { + return String.Format("Managed QMFObject {0}:{1}({2}) Properties: [{3}] Statistics: [{4}])", Schema.PackageName, Schema.ClassName, ObjectID, propertyString, statsString) ; + } else { + return String.Format("QMFObject {0}:{1} Properties: [{2}] Statistics: [{3}]", Schema.PackageName, Schema.ClassName, propertyString, statsString) ; + } + } + + public MethodResult InvokeMethod(string name, params object[] args) { + return this.InternalInvokeMethod(name, new List<object>(args), true, Broker.SYNC_TIME ) ; + } + + public MethodResult InvokeMethod(string name, int timeToLive, params object[] args) { + return this.InternalInvokeMethod(name, new List<object>(args), true, timeToLive) ; + } + + public MethodResult InvokeMethod(string name, bool synchronous, int timeToLive, params object[] args) { + return this.InternalInvokeMethod(name, new List<object>(args), synchronous, timeToLive ) ; + } + + public MethodResult InvokeMethod(string name, bool synchronous, params object[] args) { + return this.InternalInvokeMethod(name, new List<object>(args), synchronous, Broker.SYNC_TIME) ; + } + + protected MethodResult InternalInvokeMethod(string name, List<object> args, bool synchronous, int timeToLive) { + if (!Managed) { + throw new Exception ("Object is not Managed") ; + } + if (Schema.GetMethod(name) == null) { + throw new Exception (String.Format("Method named '{0}' does not exist", name)) ; + } + return Session.InvokeMethod(this, name, args, synchronous, timeToLive) ; + } + + public void Encode (IEncoder enc) { + int mask = 0 ; + int bit = 0 ; + List<SchemaProperty> propsToEncode = new List<SchemaProperty>() ; + log.Debug(String.Format("Encoding class {0}:{1}", Schema.PackageName, Schema.ClassName)) ; + + enc.WriteUint8(20) ; + Schema.Key.encode(enc) ; + + foreach (SchemaProperty prop in Schema.GetAllProperties()) { + if (prop.Optional) { + if (bit == 0) { + bit =1 ; + } + if ((Properties.ContainsKey(prop.Name)) && (Properties[prop.Name] != null)) { + mask |= bit ; + propsToEncode.Add(prop) ; + } else { + } + bit = bit << 1 ; + if (bit == 256) { + bit = 0 ; + enc.WriteUint8((short)mask) ; + mask = 0 ; + } + } else { + propsToEncode.Add(prop) ; + } + } + if (bit != 0) { + enc.WriteUint8((short)mask) ; + } + + foreach (SchemaProperty prop in propsToEncode) { + object obj = Properties[prop.Name] ; + //log.Debug(String.Format("Encoding property {0}", prop.Name)) ; + Session.EncodeValue(enc, prop.Type, obj) ; + } + foreach (SchemaStatistic stat in Schema.Statistics) { + object obj = Statistics[stat.Name] ; + Session.EncodeValue(enc, stat.Type, obj) ; + } + log.Debug("Done") ; + + } + + + protected void safeAddProperty(string propName, object value) { + if (Properties.ContainsKey(propName)) { + Properties[propName] = value ; + } else { + Properties.Add(propName, value) ; + } + } + + + } +} |