Skip to content

Commit df07ca2

Browse files
committed
First part of #301 implementation, for Smile
1 parent b0586a7 commit df07ca2

File tree

2 files changed

+122
-2
lines changed

2 files changed

+122
-2
lines changed

smile/src/main/java/com/fasterxml/jackson/dataformat/smile/databind/SmileMapper.java

+80-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.fasterxml.jackson.dataformat.smile.databind;
22

33
import com.fasterxml.jackson.core.Version;
4+
45
import com.fasterxml.jackson.databind.ObjectMapper;
56
import com.fasterxml.jackson.databind.cfg.MapperBuilder;
7+
68
import com.fasterxml.jackson.dataformat.smile.PackageVersion;
79
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
10+
import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
11+
import com.fasterxml.jackson.dataformat.smile.SmileParser;
812

913
/**
1014
* Specialized {@link ObjectMapper} to use with CBOR format backend.
@@ -17,14 +21,89 @@ public class SmileMapper extends ObjectMapper
1721

1822
/**
1923
* Base implementation for "Vanilla" {@link ObjectMapper}, used with
20-
* CBOR backend.
24+
* Smile backend.
2125
*
2226
* @since 2.10
2327
*/
2428
public static class Builder extends MapperBuilder<SmileMapper, Builder>
2529
{
30+
protected final SmileFactory _streamFactory; // since 2.14
31+
2632
public Builder(SmileMapper m) {
2733
super(m);
34+
_streamFactory = m.getFactory();
35+
}
36+
37+
/*
38+
/******************************************************************
39+
/* Format features
40+
/******************************************************************
41+
*/
42+
43+
/**
44+
* @since 2.14
45+
*/
46+
public Builder enable(SmileParser.Feature... features) {
47+
for (SmileParser.Feature f : features) {
48+
_streamFactory.enable(f);
49+
}
50+
return this;
51+
}
52+
53+
/**
54+
* @since 2.14
55+
*/
56+
public Builder disable(SmileParser.Feature... features) {
57+
for (SmileParser.Feature f : features) {
58+
_streamFactory.disable(f);
59+
}
60+
return this;
61+
}
62+
63+
/**
64+
* @since 2.14
65+
*/
66+
public Builder configure(SmileParser.Feature f, boolean state)
67+
{
68+
if (state) {
69+
_streamFactory.enable(f);
70+
} else {
71+
_streamFactory.disable(f);
72+
}
73+
return this;
74+
}
75+
76+
/**
77+
* @since 2.14
78+
*/
79+
public Builder enable(SmileGenerator.Feature... features) {
80+
for (SmileGenerator.Feature f : features) {
81+
_streamFactory.enable(f);
82+
}
83+
return this;
84+
}
85+
86+
/**
87+
* @since 2.14
88+
*/
89+
public Builder disable(SmileGenerator.Feature... features) {
90+
for (SmileGenerator.Feature f : features) {
91+
_streamFactory.disable(f);
92+
}
93+
return this;
94+
}
95+
96+
/**
97+
* @since 2.14
98+
*/
99+
public Builder configure(SmileGenerator.Feature f, boolean state)
100+
{
101+
if (state) {
102+
_streamFactory.enable(f);
103+
} else {
104+
_streamFactory.disable(f);
105+
}
106+
return this;
28107
}
29108
}
30109

@@ -46,7 +125,6 @@ protected SmileMapper(SmileMapper src) {
46125
super(src);
47126
}
48127

49-
@SuppressWarnings("unchecked")
50128
public static SmileMapper.Builder builder() {
51129
return new Builder(new SmileMapper());
52130
}

smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/SmileMapperTest.java

+42
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@
1111
import com.fasterxml.jackson.annotation.JsonCreator;
1212
import com.fasterxml.jackson.annotation.JsonValue;
1313
import com.fasterxml.jackson.core.*;
14+
import com.fasterxml.jackson.core.exc.StreamReadException;
1415
import com.fasterxml.jackson.core.type.TypeReference;
1516
import com.fasterxml.jackson.databind.JsonNode;
1617
import com.fasterxml.jackson.databind.ObjectMapper;
1718
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
1819
import com.fasterxml.jackson.databind.node.ArrayNode;
1920
import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile;
2021
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
22+
import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
23+
import com.fasterxml.jackson.dataformat.smile.SmileParser;
24+
import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper;
2125

2226
public class SmileMapperTest extends BaseTestForSmile
2327
{
@@ -168,4 +172,42 @@ private byte[] _generateHugeDoc(SmileFactory f) throws IOException
168172
g.close();
169173
return b.toByteArray();
170174
}
175+
176+
/*
177+
/**********************************************************
178+
/* Tests for [dataformats-binary#301]
179+
/**********************************************************
180+
*/
181+
182+
public void testStreamingFeaturesViaMapper() throws Exception
183+
{
184+
SmileMapper mapperWithHeaders = SmileMapper.builder()
185+
.enable(SmileGenerator.Feature.WRITE_HEADER)
186+
.enable(SmileParser.Feature.REQUIRE_HEADER)
187+
.build();
188+
byte[] encodedWithHeader = mapperWithHeaders.writeValueAsBytes("foo");
189+
assertEquals(8, encodedWithHeader.length);
190+
191+
SmileMapper mapperNoHeaders = SmileMapper.builder()
192+
.disable(SmileGenerator.Feature.WRITE_HEADER)
193+
.disable(SmileParser.Feature.REQUIRE_HEADER)
194+
.build();
195+
byte[] encodedNoHeader = mapperNoHeaders.writeValueAsBytes("foo");
196+
assertEquals(4, encodedNoHeader.length);
197+
198+
// And then see that we can parse; with header always
199+
assertEquals("foo", mapperWithHeaders.readValue(encodedWithHeader, Object.class));
200+
assertEquals("foo", mapperNoHeaders.readValue(encodedWithHeader, Object.class));
201+
202+
// without if not required
203+
assertEquals("foo", mapperNoHeaders.readValue(encodedNoHeader, Object.class));
204+
205+
// But the reverse will fail
206+
try {
207+
mapperWithHeaders.readValue(encodedNoHeader, Object.class);
208+
fail("Should not pass");
209+
} catch (StreamReadException e) {
210+
verifyException(e, "Input does not start with Smile format header");
211+
}
212+
}
171213
}

0 commit comments

Comments
 (0)