Skip to content

Commit 9b9b7d7

Browse files
Fields not assigned in FromXmlFile should retain the _N flag as true (#1074)
1 parent 44ebe75 commit 9b9b7d7

File tree

4 files changed

+307
-5
lines changed

4 files changed

+307
-5
lines changed

dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,7 @@ public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSe
10481048
static readonly IGXLogger log = GXLoggerFactory.GetLogger<GxUserType>();
10491049
protected ConcurrentDictionary<string,byte> dirties = new ConcurrentDictionary<string, byte>(StringComparer.OrdinalIgnoreCase);
10501050
private const string PROPERTY_PREFIX = "gxtpr_";
1051+
private const string FIELD_PREFIX = "gxTv_";
10511052
static object setupChannelObject = null;
10521053
static bool setupChannelInitialized;
10531054
[XmlIgnore]
@@ -1115,9 +1116,10 @@ public virtual bool IsDirty(string fieldName)
11151116
}
11161117
public virtual void Copy(GxUserType source)
11171118
{
1118-
foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(source))
1119+
foreach (FieldInfo item in GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
11191120
{
1120-
item.SetValue(this, item.GetValue(source));
1121+
if (item.Name.StartsWith(FIELD_PREFIX))
1122+
item.SetValue(this, item.GetValue(source));
11211123
}
11221124
}
11231125

@@ -1176,7 +1178,7 @@ public bool IsEqual(GxUserType source)
11761178
return false;
11771179
foreach (FieldInfo item in GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
11781180
{
1179-
if (item.Name.StartsWith("gxTv_"))
1181+
if (item.Name.StartsWith(FIELD_PREFIX))
11801182
{
11811183
GxUserType thisGxUserType = item.GetValue(this) as GxUserType;
11821184
GxUserType sourceGxUserType = item.GetValue(source) as GxUserType;
@@ -1667,7 +1669,7 @@ public void FromJSONObject(dynamic obj)
16671669
{
16681670

16691671
string sVar = uploadPath.Replace(GXFormData.FORMDATA_REFERENCE, string.Empty);
1670-
MethodInfo setBlob = GetMethodInfo("gxtv_" + GetType().Name + "_" + name + "_setblob");
1672+
MethodInfo setBlob = GetMethodInfo(FIELD_PREFIX + GetType().Name + "_" + name + "_setblob");
16711673
if (setBlob != null)
16721674
{
16731675
if (HttpHelper.GetHttpRequestPostedFile(context, sVar, out uploadPath))
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using GeneXus.Application;
2+
using GeneXus.Programs;
3+
using Xunit;
4+
5+
namespace DotNetCoreUnitTest.Domain
6+
{
7+
public class SdtXmlSerializationTest
8+
{
9+
[Fact]
10+
public void EmptyValuesDeserializationTest()
11+
{
12+
GxContext context = new GxContext();
13+
SdtEmisor emisor = new SdtEmisor(context);
14+
string xml = "<Emisor xmlns=\"\">";
15+
xml += " <RUCEmisor>212934610017</RUCEmisor>";
16+
xml += " <RznSoc>ISL</RznSoc>";
17+
xml += " <Departamento>MKT</Departamento>";
18+
xml += "</Emisor>";
19+
20+
emisor.FromXml(xml, null, "", "");
21+
bool shouldSerializeField = emisor.ShouldSerializegxTpr_Giroemis();
22+
Assert.False(shouldSerializeField, "GiroEmis should not be serialized since it was not assigned during XML deserialization");
23+
24+
shouldSerializeField = emisor.ShouldSerializegxTpr_Departamento();
25+
Assert.True(shouldSerializeField, "Departamento should be serialized since it was assigned during XML deserialization");
26+
27+
}
28+
}
29+
}
Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,272 @@
1+
/*
2+
File: type_SdtEmisor
3+
Description: Emisor
4+
Author: Nemo 🐠 for C# version 18.0.11.184517
5+
Program type: Callable routine
6+
Main DBMS:
7+
*/
8+
using System;
9+
using System.Collections;
10+
using System.ServiceModel;
11+
using System.Xml.Serialization;
12+
using GeneXus.Application;
13+
using GeneXus.Utils;
14+
15+
16+
namespace GeneXus.Programs
17+
{
18+
[XmlSerializerFormat]
19+
[XmlRoot(ElementName="Emisor")]
20+
[XmlType(TypeName="Emisor")]
21+
[Serializable]
22+
public class SdtEmisor : GxUserType
23+
{
24+
public SdtEmisor( )
25+
{
26+
/* Constructor for serialization */
27+
gxTv_SdtEmisor_Rucemisor = "";
28+
gxTv_SdtEmisor_Rucemisor_N = true;
29+
30+
gxTv_SdtEmisor_Rznsoc = "";
31+
gxTv_SdtEmisor_Rznsoc_N = true;
32+
33+
gxTv_SdtEmisor_Nomcomercial = "";
34+
gxTv_SdtEmisor_Nomcomercial_N = true;
35+
36+
gxTv_SdtEmisor_Giroemis = "";
37+
gxTv_SdtEmisor_Giroemis_N = true;
38+
39+
gxTv_SdtEmisor_Departamento = "";
40+
gxTv_SdtEmisor_Departamento_N = true;
41+
42+
}
43+
44+
public SdtEmisor(IGxContext context)
45+
{
46+
this.context = context;
47+
initialize();
48+
}
49+
50+
#region Json
51+
private static Hashtable mapper;
52+
public override string JsonMap(string value)
53+
{
54+
if (mapper == null)
55+
{
56+
mapper = new Hashtable();
57+
}
58+
return (string)mapper[value]; ;
59+
}
60+
61+
public override void ToJSON()
62+
{
63+
ToJSON(true) ;
64+
return;
65+
}
66+
67+
public override void ToJSON(bool includeState)
68+
{
69+
AddObjectProperty("RUCEmisor", gxTpr_Rucemisor, false);
70+
71+
72+
AddObjectProperty("RznSoc", gxTpr_Rznsoc, false);
73+
74+
75+
AddObjectProperty("NomComercial", gxTpr_Nomcomercial, false);
76+
77+
78+
AddObjectProperty("GiroEmis", gxTpr_Giroemis, false);
79+
80+
81+
AddObjectProperty("Departamento", gxTpr_Departamento, false);
82+
83+
return;
84+
}
85+
#endregion
86+
87+
#region Properties
88+
[SoapElement(ElementName="RUCEmisor")]
89+
[XmlElement(ElementName="RUCEmisor")]
90+
public string gxTpr_Rucemisor
91+
{
92+
get {
93+
return gxTv_SdtEmisor_Rucemisor;
94+
}
95+
set {
96+
gxTv_SdtEmisor_Rucemisor_N = false;
97+
gxTv_SdtEmisor_Rucemisor = value;
98+
SetDirty("Rucemisor");
99+
}
100+
}
101+
102+
public bool ShouldSerializegxTpr_Rucemisor()
103+
104+
{
105+
return !gxTv_SdtEmisor_Rucemisor_N;
106+
107+
}
108+
109+
110+
111+
[SoapElement(ElementName="RznSoc")]
112+
[XmlElement(ElementName="RznSoc")]
113+
public string gxTpr_Rznsoc
114+
{
115+
get {
116+
return gxTv_SdtEmisor_Rznsoc;
117+
}
118+
set {
119+
gxTv_SdtEmisor_Rznsoc_N = false;
120+
gxTv_SdtEmisor_Rznsoc = value;
121+
SetDirty("Rznsoc");
122+
}
123+
}
124+
125+
public bool ShouldSerializegxTpr_Rznsoc()
126+
127+
{
128+
return !gxTv_SdtEmisor_Rznsoc_N;
129+
130+
}
131+
132+
133+
134+
[SoapElement(ElementName="NomComercial")]
135+
[XmlElement(ElementName="NomComercial")]
136+
public string gxTpr_Nomcomercial
137+
{
138+
get {
139+
return gxTv_SdtEmisor_Nomcomercial;
140+
}
141+
set {
142+
gxTv_SdtEmisor_Nomcomercial_N = false;
143+
gxTv_SdtEmisor_Nomcomercial = value;
144+
SetDirty("Nomcomercial");
145+
}
146+
}
147+
148+
public bool ShouldSerializegxTpr_Nomcomercial()
149+
150+
{
151+
return !gxTv_SdtEmisor_Nomcomercial_N;
152+
153+
}
154+
155+
156+
157+
[SoapElement(ElementName="GiroEmis")]
158+
[XmlElement(ElementName="GiroEmis")]
159+
public string gxTpr_Giroemis
160+
{
161+
get {
162+
return gxTv_SdtEmisor_Giroemis;
163+
}
164+
set {
165+
gxTv_SdtEmisor_Giroemis_N = false;
166+
gxTv_SdtEmisor_Giroemis = value;
167+
SetDirty("Giroemis");
168+
}
169+
}
170+
171+
public bool ShouldSerializegxTpr_Giroemis()
172+
173+
{
174+
return !gxTv_SdtEmisor_Giroemis_N;
175+
176+
}
177+
178+
179+
180+
[SoapElement(ElementName="Departamento")]
181+
[XmlElement(ElementName="Departamento")]
182+
public string gxTpr_Departamento
183+
{
184+
get {
185+
return gxTv_SdtEmisor_Departamento;
186+
}
187+
set {
188+
gxTv_SdtEmisor_Departamento_N = false;
189+
gxTv_SdtEmisor_Departamento = value;
190+
SetDirty("Departamento");
191+
}
192+
}
193+
194+
public bool ShouldSerializegxTpr_Departamento()
195+
196+
{
197+
return !gxTv_SdtEmisor_Departamento_N;
198+
199+
}
200+
201+
202+
public override bool ShouldSerializeSdtJson()
203+
{
204+
return true;
205+
}
206+
207+
208+
209+
#endregion
210+
211+
#region Static Type Properties
212+
213+
[SoapIgnore]
214+
[XmlIgnore]
215+
private static GXTypeInfo _typeProps;
216+
protected override GXTypeInfo TypeInfo { get { return _typeProps; } set { _typeProps = value; } }
217+
218+
#endregion
219+
220+
#region Initialization
221+
222+
public void initialize( )
223+
{
224+
gxTv_SdtEmisor_Rucemisor = "";
225+
gxTv_SdtEmisor_Rucemisor_N = true;
226+
227+
gxTv_SdtEmisor_Rznsoc = "";
228+
gxTv_SdtEmisor_Rznsoc_N = true;
229+
230+
gxTv_SdtEmisor_Nomcomercial = "";
231+
gxTv_SdtEmisor_Nomcomercial_N = true;
232+
233+
gxTv_SdtEmisor_Giroemis = "";
234+
gxTv_SdtEmisor_Giroemis_N = true;
235+
236+
gxTv_SdtEmisor_Departamento = "";
237+
gxTv_SdtEmisor_Departamento_N = true;
238+
239+
return ;
240+
}
241+
242+
243+
244+
#endregion
245+
246+
#region Declaration
247+
248+
protected string gxTv_SdtEmisor_Rucemisor;
249+
protected bool gxTv_SdtEmisor_Rucemisor_N;
250+
251+
252+
protected string gxTv_SdtEmisor_Rznsoc;
253+
protected bool gxTv_SdtEmisor_Rznsoc_N;
254+
255+
256+
protected string gxTv_SdtEmisor_Nomcomercial;
257+
protected bool gxTv_SdtEmisor_Nomcomercial_N;
258+
259+
260+
protected string gxTv_SdtEmisor_Giroemis;
261+
protected bool gxTv_SdtEmisor_Giroemis_N;
262+
263+
264+
protected string gxTv_SdtEmisor_Departamento;
265+
protected bool gxTv_SdtEmisor_Departamento_N;
266+
267+
268+
269+
#endregion
270+
}
271+
272+
}

dotnet/test/DotNetCoreUnitTest/DotNetCoreUnitTest.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@
164164

165165
<ItemGroup>
166166
<Folder Include="ConfigMappings\" />
167-
<Folder Include="Domain\" />
168167
<Folder Include="Log\" />
169168
<Folder Include="PDF\" />
170169
<Folder Include="resources\xml\" />

0 commit comments

Comments
 (0)