Skip to content

Commit 66e6cfb

Browse files
author
Vlad Ionescu
committed
making IContentHeader and all classes that derive from it ICloneable; adding tests for cloning BasicProperties, StreamProperties and FileProperties for all implementations
1 parent 5bd997a commit 66e6cfb

File tree

7 files changed

+568
-7
lines changed

7 files changed

+568
-7
lines changed

src/apigen/Apigen.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,11 +481,26 @@ public void EmitClassProperties(AmqpClass c) {
481481
if (!IsBoolean(f)) {
482482
EmitLine(" public "+maybeOverride+"void Clear"+MangleClass(f.Name)+"() { m_"+MangleMethod(f.Name)+"_present = false; }");
483483
}
484+
}
485+
486+
EmitLine("");
487+
foreach (AmqpField f in c.m_Fields)
488+
{
489+
if (!IsBoolean(f))
490+
EmitLine(" public " + maybeOverride + "bool Is" + MangleClass(f.Name) + "Present() { return m_" + MangleMethod(f.Name) + "_present; }");
484491
}
492+
485493
EmitLine("");
486494
EmitLine(" public "+MangleClass(c.Name)+"Properties() {}");
487495
EmitLine(" public override int ProtocolClassId { get { return "+c.Index+"; } }");
488-
EmitLine(" public override string ProtocolClassName { get { return \""+c.Name+"\"; } }");
496+
EmitLine(" public override string ProtocolClassName { get { return \""+c.Name+"\"; } }");
497+
EmitLine("");
498+
EmitLine(" public override object Clone()");
499+
EmitLine(" {");
500+
EmitLine(" " + MangleClass(c.Name) + "Properties copy = new " + MangleClass(c.Name) + "Properties();");
501+
EmitLine(" copy.setCloneableMembersFrom(this);");
502+
EmitLine(" return copy;");
503+
EmitLine(" }");
489504
EmitLine("");
490505
EmitLine(" public override void ReadPropertiesFrom(RabbitMQ.Client.Impl.ContentHeaderPropertyReader reader) {");
491506
foreach (AmqpField f in c.m_Fields)

src/client/api/IContentHeader.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,13 @@
5353
//
5454
// Contributor(s): ______________________________________.
5555
//
56-
//---------------------------------------------------------------------------
56+
//---------------------------------------------------------------------------
57+
using System;
58+
5759
namespace RabbitMQ.Client
5860
{
5961
///<summary>A decoded AMQP content header frame.</summary>
60-
public interface IContentHeader
62+
public interface IContentHeader : ICloneable
6163
{
6264
///<summary>Retrieve the AMQP class ID of this content header.</summary>
6365
int ProtocolClassId { get; }

src/client/impl/BasicProperties.cs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,22 @@ public abstract class BasicProperties: ContentHeaderBase, IBasicProperties {
8787
public abstract void ClearType();
8888
public abstract void ClearUserId();
8989
public abstract void ClearAppId();
90-
public abstract void ClearClusterId();
90+
public abstract void ClearClusterId();
91+
92+
public abstract bool IsContentTypePresent();
93+
public abstract bool IsContentEncodingPresent();
94+
public abstract bool IsHeadersPresent();
95+
public abstract bool IsDeliveryModePresent();
96+
public abstract bool IsPriorityPresent();
97+
public abstract bool IsCorrelationIdPresent();
98+
public abstract bool IsReplyToPresent();
99+
public abstract bool IsExpirationPresent();
100+
public abstract bool IsMessageIdPresent();
101+
public abstract bool IsTimestampPresent();
102+
public abstract bool IsTypePresent();
103+
public abstract bool IsUserIdPresent();
104+
public abstract bool IsAppIdPresent();
105+
public abstract bool IsClusterIdPresent();
91106

92107
public PublicationAddress ReplyToAddress {
93108
get {
@@ -105,5 +120,45 @@ public void SetPersistent(bool persistent) {
105120
DeliveryMode = 1;
106121
}
107122
}
123+
124+
protected override void setCloneableMembersFrom(Object src)
125+
{
126+
base.setCloneableMembersFrom(src);
127+
BasicProperties bpSrc = src as BasicProperties;
128+
129+
if(bpSrc.IsContentTypePresent())
130+
ContentType = bpSrc.ContentType;
131+
if(bpSrc.IsContentEncodingPresent())
132+
ContentEncoding = bpSrc.ContentEncoding;
133+
if(bpSrc.IsHeadersPresent())
134+
{
135+
Headers = new Hashtable();
136+
IDictionaryEnumerator enumHeaders = bpSrc.Headers.GetEnumerator();
137+
while (enumHeaders.MoveNext())
138+
Headers.Add(enumHeaders.Entry.Key, enumHeaders.Entry.Value);
139+
}
140+
if(bpSrc.IsDeliveryModePresent())
141+
DeliveryMode = bpSrc.DeliveryMode;
142+
if(bpSrc.IsPriorityPresent())
143+
Priority = bpSrc.Priority;
144+
if(bpSrc.IsCorrelationIdPresent())
145+
CorrelationId = bpSrc.CorrelationId;
146+
if(bpSrc.IsReplyToPresent())
147+
ReplyTo = bpSrc.ReplyTo;
148+
if(bpSrc.IsExpirationPresent())
149+
Expiration = bpSrc.Expiration;
150+
if(bpSrc.IsMessageIdPresent())
151+
MessageId = bpSrc.MessageId;
152+
if(bpSrc.IsTimestampPresent())
153+
Timestamp = bpSrc.Timestamp;
154+
if(bpSrc.IsTypePresent())
155+
Type = bpSrc.Type;
156+
if(bpSrc.IsUserIdPresent())
157+
UserId = bpSrc.UserId;
158+
if(bpSrc.IsAppIdPresent())
159+
AppId = bpSrc.AppId;
160+
if(bpSrc.IsClusterIdPresent())
161+
ClusterId = bpSrc.ClusterId;
162+
}
108163
}
109164
}

src/client/impl/ContentHeaderBase.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public abstract class ContentHeaderBase : IContentHeader
6868
public abstract string ProtocolClassName { get; }
6969
public abstract void ReadPropertiesFrom(ContentHeaderPropertyReader reader);
7070
public abstract void WritePropertiesTo(ContentHeaderPropertyWriter writer);
71-
public abstract void AppendPropertyDebugStringTo(System.Text.StringBuilder sb);
71+
public abstract void AppendPropertyDebugStringTo(System.Text.StringBuilder sb);
72+
public abstract Object Clone();
7273

7374
///<summary>Fill this instance from the given byte buffer
7475
///stream. Throws BodyTooLongException, which is the reason
@@ -98,6 +99,12 @@ public void WriteTo(NetworkBinaryWriter writer, ulong bodySize)
9899
writer.Write((ushort)0); // weight - not currently used
99100
writer.Write((ulong)bodySize);
100101
WritePropertiesTo(new ContentHeaderPropertyWriter(writer));
102+
}
103+
104+
protected virtual void setCloneableMembersFrom(Object src)
105+
{
106+
if (!this.GetType().Equals(src.GetType()))
107+
throw new InvalidCastException("Trying to clone from object of different type");
101108
}
102109
}
103110
}

src/client/impl/FileProperties.cs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,46 @@ public abstract class FileProperties : ContentHeaderBase, IFileProperties
7979
public abstract void ClearMessageId();
8080
public abstract void ClearFilename();
8181
public abstract void ClearTimestamp();
82-
public abstract void ClearClusterId();
82+
public abstract void ClearClusterId();
83+
84+
public abstract bool IsContentTypePresent();
85+
public abstract bool IsContentEncodingPresent();
86+
public abstract bool IsHeadersPresent();
87+
public abstract bool IsPriorityPresent();
88+
public abstract bool IsReplyToPresent();
89+
public abstract bool IsMessageIdPresent();
90+
public abstract bool IsFilenamePresent();
91+
public abstract bool IsTimestampPresent();
92+
public abstract bool IsClusterIdPresent();
93+
94+
protected override void setCloneableMembersFrom(object src)
95+
{
96+
base.setCloneableMembersFrom(src);
97+
FileProperties fpSrc = src as FileProperties;
98+
99+
if (fpSrc.IsContentTypePresent())
100+
ContentType = fpSrc.ContentType;
101+
if (fpSrc.IsContentEncodingPresent())
102+
ContentEncoding = fpSrc.ContentEncoding;
103+
if (fpSrc.IsHeadersPresent())
104+
{
105+
Headers = new Hashtable();
106+
IDictionaryEnumerator enumHeaders = fpSrc.Headers.GetEnumerator();
107+
while (enumHeaders.MoveNext())
108+
Headers.Add(enumHeaders.Entry.Key, enumHeaders.Entry.Value);
109+
}
110+
if (fpSrc.IsPriorityPresent())
111+
Priority = fpSrc.Priority;
112+
if (fpSrc.IsReplyToPresent())
113+
ReplyTo = fpSrc.ReplyTo;
114+
if (fpSrc.IsMessageIdPresent())
115+
MessageId = fpSrc.MessageId;
116+
if (fpSrc.IsFilenamePresent())
117+
Filename = fpSrc.Filename;
118+
if (fpSrc.IsTimestampPresent())
119+
Timestamp = fpSrc.Timestamp;
120+
if (fpSrc.IsClusterIdPresent())
121+
ClusterId = fpSrc.ClusterId;
122+
}
83123
}
84124
}

src/client/impl/StreamProperties.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,34 @@ public abstract class StreamProperties : ContentHeaderBase, IStreamProperties
7171
public abstract void ClearContentEncoding();
7272
public abstract void ClearHeaders();
7373
public abstract void ClearPriority();
74-
public abstract void ClearTimestamp();
74+
public abstract void ClearTimestamp();
75+
76+
public abstract bool IsContentTypePresent();
77+
public abstract bool IsContentEncodingPresent();
78+
public abstract bool IsHeadersPresent();
79+
public abstract bool IsPriorityPresent();
80+
public abstract bool IsTimestampPresent();
81+
82+
protected override void setCloneableMembersFrom(object src)
83+
{
84+
base.setCloneableMembersFrom(src);
85+
StreamProperties spSrc = src as StreamProperties;
86+
87+
if (spSrc.IsContentTypePresent())
88+
ContentType = spSrc.ContentType;
89+
if (spSrc.IsContentEncodingPresent())
90+
ContentEncoding = spSrc.ContentEncoding;
91+
if (spSrc.IsHeadersPresent())
92+
{
93+
Headers = new Hashtable();
94+
IDictionaryEnumerator enumHeaders = spSrc.Headers.GetEnumerator();
95+
while (enumHeaders.MoveNext())
96+
Headers.Add(enumHeaders.Entry.Key, enumHeaders.Entry.Value);
97+
}
98+
if (spSrc.IsPriorityPresent())
99+
Priority = spSrc.Priority;
100+
if (spSrc.IsTimestampPresent())
101+
Timestamp = spSrc.Timestamp;
102+
}
75103
}
76104
}

0 commit comments

Comments
 (0)