Skip to content

Commit ea627c5

Browse files
committed
v1.5.3: stability fixes and improvements
1 parent 24ee213 commit ea627c5

File tree

9 files changed

+208
-86
lines changed

9 files changed

+208
-86
lines changed

README.md

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -59,32 +59,37 @@ for a higher control compared to the EasyML Facade.
5959

6060

6161
### Release Notes
62+
Release 1.5.3
63+
- bugfix: EasyML writer flush
64+
- bugfix: XMLWriter text driver attribute validation
65+
- bugfix: XMLWriter and XMLReader allow field names containing "$"
66+
- bugfix: only register AWT strategies if AWT available
6267

63-
!Release 1.5.2
68+
69+
Release 1.5.2
6470
- feature: added generic mechanism for cache clearing.
6571

6672

67-
!Release 1.5.1
73+
Release 1.5.1
6874
- feature: added functional API.
6975
- feature: added CalendarStrategy and OptionalStrategy.
7076
- feature: added java.time strategies.
7177
- performance: added caching to SerializableStrategy.
7278
- refactor: remove Profile feature.
7379

7480

75-
!Release 1.5.0
76-
- requires Java 8 or later.
81+
Release 1.5.0 (requires Java 8, recommended up to Java 9)
82+
- feature: support for Java 9 security.
7783
- NON-BACKWARD COMPATIBLE refactor of ReflectionUtil.
78-
- feature: support for Java 9 security model.
7984

8085

81-
!Release 1.4.7
86+
Release 1.4.7
8287
- last Java 7 compatible release.
8388
- bugfix: performance regression in Serialization strategy.
8489
- remove AccessibleObject.isAccessible calls.
8590

8691

87-
!Release 1.4.6
92+
Release 1.4.6
8893
- remove deprecated v1.3.4 object-o and array-o strategies.
8994
- replaced MarshalContext aliasFor methods with aliasOrNameFor methods.
9095
- bugfix: EnumStrategy marshalling fix.
@@ -93,20 +98,20 @@ for a higher control compared to the EasyML Facade.
9398
- feature: added serialization serialPersistentFields support.
9499

95100

96-
!Release 1.4.5
101+
Release 1.4.5
97102
- performance: improved n.s.e.EasyML.deserialize() speed by reusing the
98103
XmlPullParser when available.
99104
- refactor: minor code improvements.
100105

101106

102-
!Release 1.4.4
107+
Release 1.4.4
103108
- refactor: made n.s.e.m.CompositeStrategy.unmarshalInit return type more
104109
loose to better support readResolve in n.s.e.m.j.i.ExternalizableStrategy.
105110
- refactor: n.s.e.XMLReader and n.s.e.XMLWriter use HashMap instead of
106111
ConcurrentHashMap if not in shared mode (i.e. if in standalone mode).
107112

108113

109-
!Release 1.4.3
114+
Release 1.4.3
110115
- feature: new n.s.e.m.j.i.ExternalizableStrategy offers support for the
111116
Java Externalizable protocol.
112117
- feature: new n.s.e.XMLReader.hasMore method.
@@ -116,35 +121,40 @@ EasyML.Profile.Generic for more portable XML.
116121
object input and output streams.
117122

118123

119-
!Release 1.4.2
124+
Release 1.4.2
120125
- bugfix: n.s.e.m.j.i.SerializableStrategy GetFieldImpl readFields fix.
121126

122127

123-
!Release 1.4.1
128+
Release 1.4.1
124129
- bugfix: XMLWriter text driver empty line when pretty printing.
125130

126131

127-
!Release 1.4.0
132+
Release 1.4.0
128133
- NON-BACKWARD COMPATIBLE refactor: EasyML now immutable(removed setters).
129134
- feature: EasyMLBuilder for easyml customization.
130135

131136

132-
!Release 1.3.10
137+
Release 1.3.11
138+
- bugfix: n.s.e.m.j.i.SerializableStrategy GetFieldImpl readFields fix.
139+
- bugfix: XMLWriter text driver startElement impl improvement.
140+
141+
142+
Release 1.3.10
133143
- bugfix: XMLWriter text driver empty line when pretty printing.
134144
- javadoc: improvements.
135145

136146

137-
!Release 1.3.9
147+
Release 1.3.9
138148
- feature: EasyML, XMLReader, XMLWriter custom XML root tag setting.
139149
- refactor: source level 1.7 warnings fixed.
140150

141151

142-
!Release 1.3.8
152+
Release 1.3.8
143153
- performance: EasyML cache reflected class constructors.
144154
- feature: EasyML, XMLReader, XMLWriter clearCache() methods.
145155

146156

147-
!Release 1.3.7
157+
Release 1.3.7
148158
- performance: EasyML and XMLReader cache reflected classes and fields.
149159
This is done via n.s.e.m.UnmarshalContext's classFor() and fieldFor().
150160
Distinct EasyML instances have separate caches.
@@ -154,13 +164,13 @@ XMLReaders share caches only when isSharedConfiguration().
154164
- bugfix: remove duplicate encoded.clear() from XMLWriter.reset().
155165

156166

157-
!Release 1.3.6
167+
Release 1.3.6
158168
- feature: added n.s.e.EasyML.releaseCurrentReader()
159-
and n.s.e.EasyML.releaseCurrentWriter() methods.
169+
and n.s.e.EasyML.releaseCurrentWriter() methods.
160170
- performance: removed the redundant easyml version attribute.
161171

162172

163-
!Release 1.3.5
173+
Release 1.3.5
164174
- performance: reduced the impact of class aliasing and field aliasing
165175
features, even when NOT used, on serialize() and deserialize() times.
166176
- performance: n.s.e.u.ReflectionUtil unsafe instantiation method now
@@ -172,7 +182,7 @@ security reasons.
172182
it was deprecated since version 1.2.2.
173183
- refactor: renamed "object-o", "array-o" to "objectx", "arrayx"
174184
- bugfix: object field values could get inverted at read if ALL of the
175-
following conditions hold:
185+
following conditions hold:
176186
1. skipDefaults is enabled.
177187
2. instance has same name fields on different inheritance levels.
178188
3. instance defines default values on each level.
@@ -184,32 +194,32 @@ XML outputted by versions 1.3.5 down to 1.2.1 and will produce only
184194
1.3.5 formatted XML.
185195

186196

187-
!Release 1.3.4
197+
Release 1.3.4
188198
- performance: n.s.e.XMLWriterTextDriver improvements allow EasyML to
189-
perform up to 20% faster. The performance improvement is more
190-
pronounced when pretty printing is enabled.
199+
perform up to 20% faster. The performance improvement is more
200+
pronounced when pretty printing is enabled.
191201

192202

193-
!Release 1.3.3
203+
Release 1.3.3
194204
- doc: better javadoc for n.s.e.EasyML, n.s.e.XMLReader, n.s.e.XMLWriter.
195205
- bugfix: include position descriptor in each InvalidFormatException case.
196206
- bugfix: n.s.e.XMLReaderTextDriver.consumeFully() fix.
197207

198208

199-
!Release 1.3.2
209+
Release 1.3.2
200210
- performance: n.s.e.EasyML serialize() and deserialize() methods use
201211
ThreadLocal internally for XMLWriter and XMLReader instance reuse,
202212
in order to improve performance, while remaining thread-safe.
203213

204214

205-
!Release 1.3.1
215+
Release 1.3.1
206216
- feature: added n.s.e.EasyML newReader() and newWriter methods in order
207217
to expose more API features at facade level.
208218
- bugfix: prevent shared-config readers and writers from allowing config
209219
modifications.
210220

211221

212-
!Release 1.3.0
222+
Release 1.3.0
213223
- NON-BACKWARD COMPATIBLE refactor:
214224
merged n.s.e.ExtendedEasyML into n.s.e.EasyML.
215225
- feature: n.s.e.EasyML facade is now thread-safe while the thread-unsafe
@@ -222,25 +232,3 @@ multithread features.
222232
Note: except for the last mentioned bugfix, all other changes were made
223233
to offer an easier and faster API for multithreaded environments.
224234

225-
226-
!Release 1.2.6
227-
- feature: fail first security policy enforcement for n.s.e.XMLReader
228-
readObject and readArray.
229-
- bugfix: security policy now validates params at add and addHierarchy.
230-
- bugfix: consume remaining XML on security policy exception, to allow
231-
subsequent reads, if possible.
232-
- bugfix: better XMLWriter and XMLReader close method impls.
233-
234-
235-
!Release 1.2.5
236-
- feature: n.s.e.EasyML and n.s.e.XMLReader: new securityPolicy settings
237-
used to configure, if needed, black- or whitelists for objects found at
238-
deserialization time.
239-
240-
241-
!Release 1.2.4
242-
- NON-BACKWARD COMPATIBLE refactor: n.s.e.m.CompositeStrategy: removed the
243-
"defTarget" parameter as it was only used when skipDefaults was true
244-
and it was buggy in some cases such as a bean setting a property in a
245-
default sub-bean (composition, not inheritance) within it's default constructor.
246-

easyml/src/net/sourceforge/easyml/EasyML.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
* objects.<br/>
8181
*
8282
* @author Victor Cordis ( cordis.victor at gmail.com)
83-
* @version 1.5.1
83+
* @version 1.5.3
8484
* @see XMLReader
8585
* @see XMLWriter
8686
* @since 1.0
@@ -202,7 +202,9 @@ public static void defaultConfiguration(XMLWriter writer) {
202202
// simple.add(IntStrategy.INSTANCE);
203203
// simple.add(StringStrategy.INSTANCE);
204204
// awt:
205-
composite.add(ColorStrategy.INSTANCE);
205+
if (ColorStrategy.isAvailable()) {
206+
composite.add(ColorStrategy.INSTANCE);
207+
}
206208
// io:
207209
composite.add(ExternalizableStrategy.INSTANCE);
208210
simple.add(FileStrategy.INSTANCE);
@@ -286,7 +288,9 @@ public static void defaultConfiguration(XMLReader reader) {
286288
// simple.put(IntStrategy.NAME, IntStrategy.INSTANCE);
287289
// simple.put(StringStrategy.NAME, StringStrategy.INSTANCE);
288290
// awt:
289-
composite.put(ColorStrategy.NAME, ColorStrategy.INSTANCE);
291+
if (ColorStrategy.isAvailable()) {
292+
composite.put(ColorStrategy.NAME, ColorStrategy.INSTANCE);
293+
}
290294
// io:
291295
composite.put(ExternalizableStrategy.NAME, ExternalizableStrategy.INSTANCE);
292296
simple.put(FileStrategy.NAME, FileStrategy.INSTANCE);
@@ -597,8 +601,11 @@ public XMLReader newReader(Document in) {
597601
public void serialize(Object o, Writer out) {
598602
final XMLWriter writer = this.perThreadWriter.get();
599603
writer.reset(out);
600-
writer.write(o);
601-
writer.flush();
604+
try {
605+
writer.write(o);
606+
} finally {
607+
writer.flush();
608+
}
602609
}
603610

604611
/**
@@ -640,8 +647,11 @@ public String serialize(Object o) {
640647
public void serialize(Object o, Document out) {
641648
final XMLWriter writer = this.perThreadWriter.get();
642649
writer.reset(out);
643-
writer.write(o);
644-
writer.flush();
650+
try {
651+
writer.write(o);
652+
} finally {
653+
writer.flush();
654+
}
645655
}
646656

647657
/**
@@ -705,7 +715,7 @@ public Object deserialize(Document in) {
705715
/**
706716
* Releases the XML writer, if any, belonging to the current thread. If this
707717
* method isn't invoked, the XML writer will be released anyway at the
708-
* current threads death.
718+
* current thread's death.
709719
* <br>
710720
* <b>Note:</b> this is an advanced feature and should be used only if the
711721
* caller knows this thread won't be using this EasyML instance for
@@ -718,7 +728,7 @@ public void releaseCurrentWriter() {
718728
/**
719729
* Releases the XML reader, if any, belonging to the current thread. If this
720730
* method isn't invoked, the XML reader will be released anyway at the
721-
* current threads death.
731+
* current thread's death.
722732
* <br>
723733
* <b>Note:</b> this is an advanced feature and should be used only if the
724734
* caller knows this thread won't be using this EasyML instance for

easyml/src/net/sourceforge/easyml/XMLReaderDOMDriver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package net.sourceforge.easyml;
2020

21+
import net.sourceforge.easyml.util.XMLUtil;
2122
import org.w3c.dom.Document;
2223
import org.w3c.dom.Element;
2324
import org.w3c.dom.Node;
@@ -31,7 +32,7 @@
3132
* transforming the DOM to text so that it can be inputed as text to EasyML.
3233
*
3334
* @author Victor Cordis ( cordis.victor at gmail.com)
34-
* @version 1.3.9
35+
* @version 1.5.3
3536
* @since 1.1.0
3637
*/
3738
final class XMLReaderDOMDriver extends XMLReader.Driver {
@@ -155,7 +156,7 @@ public String elementName() {
155156
if (this.crt == null) {
156157
throw new IllegalStateException("not at element start or end: " + this.positionDescriptor());
157158
}
158-
return this.crt.getNodeName();
159+
return XMLUtil.unescapeXMLTag(this.crt.getNodeName());
159160
}
160161

161162
/**

easyml/src/net/sourceforge/easyml/XMLReaderTextDriver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package net.sourceforge.easyml;
2020

21+
import net.sourceforge.easyml.util.XMLUtil;
2122
import org.kxml2.io.KXmlParser;
2223
import org.xmlpull.v1.XmlPullParser;
2324
import org.xmlpull.v1.XmlPullParserException;
@@ -33,7 +34,7 @@
3334
* parameters.
3435
*
3536
* @author Victor Cordis ( cordis.victor at gmail.com)
36-
* @version 1.4.5
37+
* @version 1.5.3
3738
* @since 1.1.0
3839
*/
3940
final class XMLReaderTextDriver extends XMLReader.Driver {
@@ -131,7 +132,7 @@ public String elementName() {
131132
try {
132133
final int eventType = this.parser.getEventType();
133134
if (eventType == XmlPullParser.START_TAG || eventType == XmlPullParser.END_TAG) {
134-
return this.parser.getName();
135+
return XMLUtil.unescapeXMLTag(this.parser.getName());
135136
}
136137
throw new IllegalStateException("expected element start or end: " + this.parser.getLineNumber() + "," + this.parser.getColumnNumber());
137138
} catch (XmlPullParserException xppX) {

easyml/src/net/sourceforge/easyml/XMLWriterDOMDriver.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package net.sourceforge.easyml;
2020

21+
import net.sourceforge.easyml.util.XMLUtil;
2122
import org.w3c.dom.Document;
2223
import org.w3c.dom.Element;
2324
import org.w3c.dom.Node;
@@ -27,7 +28,7 @@
2728
* XML to DOM documents.
2829
*
2930
* @author Victor Cordis ( cordis.victor at gmail.com)
30-
* @version 1.3.9
31+
* @version 1.5.3
3132
* @since 1.1.0
3233
*/
3334
final class XMLWriterDOMDriver extends XMLWriter.Driver {
@@ -61,7 +62,8 @@ public void startElement(String name) {
6162
throw new IllegalStateException("cannot write element start");
6263
}
6364
// update state:
64-
final Element started = this.root.createElement(name);
65+
final String escapedName = XMLUtil.escapeXMLTag(name);
66+
final Element started = this.root.createElement(escapedName);
6567
if (this.crt == null) {
6668
this.root.appendChild(started);
6769
} else {

0 commit comments

Comments
 (0)