Skip to content

Commit

Permalink
Minor cleanup: add setting of new IonParser/-Generator features via I…
Browse files Browse the repository at this point in the history
…onFactoryBuilder
  • Loading branch information
cowtowncoder committed Dec 10, 2020
1 parent 5eb205f commit 1b3f33e
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,13 @@ protected IonFactory(IonFactory src, ObjectCodec oc)

/**
* Constructors used by {@link IonFactoryBuilder} for instantiation.
*
* @since 3.0
*/
protected IonFactory(IonFactoryBuilder b) {
super(b, false);
_cfgCreateBinaryWriters = b.willCreateBinaryWriters();
_system = b.ionSystem();
_ionParserFeatures = b.formatParserFeaturesMask();
_ionGeneratorFeatures = b.formatGeneratorFeaturesMask();
}

@Override
Expand All @@ -119,14 +119,6 @@ public static IonFactory forBinaryWriters() {
return new IonFactoryBuilder(true).build();
}

/**
* Method for creating {@link IonFactoryBuilder} initialized with settings to
* create binary (not textual) writers.
*/
public static IonFactoryBuilder builderForBinaryWriters() {
return new IonFactoryBuilder(true);
}

/**
* Method for creating {@link IonFactory} that will
* create textual (not binary) writers.
Expand All @@ -135,6 +127,14 @@ public static IonFactory forTextualWriters() {
return new IonFactoryBuilder(false).build();
}

/**
* Method for creating {@link IonFactoryBuilder} initialized with settings to
* create binary (not textual) writers.
*/
public static IonFactoryBuilder builderForBinaryWriters() {
return new IonFactoryBuilder(true);
}

/**
* Method for creating {@link IonFactoryBuilder} initialized with settings to
* create textual (not binary) writers.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,20 @@ public class IonFactoryBuilder extends TSFBuilder<IonFactory, IonFactoryBuilder>

protected boolean _createBinaryWriters;

/**
* Set of {@link IonParser.Feature}s enabled, as bitmask.
*
* @since 2.12
*/
protected int _formatParserFeatures;

/**
* Set of {@link IonGenerator.Feature}s enabled, as bitmask.
*
* @since 2.12
*/
protected int _formatGeneratorFeatures;

/*
/**********************************************************
/* Life cycle
Expand All @@ -36,14 +50,28 @@ public class IonFactoryBuilder extends TSFBuilder<IonFactory, IonFactoryBuilder>

protected IonFactoryBuilder(boolean createBinary) {
_createBinaryWriters = createBinary;
_formatParserFeatures = IonFactory.DEFAULT_ION_PARSER_FEATURE_FLAGS;
_formatGeneratorFeatures = IonFactory.DEFAULT_ION_GENERATOR_FEATURE_FLAGS;
}

public IonFactoryBuilder(IonFactory base) {
super(base);
_createBinaryWriters = base._cfgCreateBinaryWriters;
_formatParserFeatures = base._ionParserFeatures;
_formatGeneratorFeatures = base._ionGeneratorFeatures;
}

// // // Configuration
@Override
public IonFactory build() {
// 28-Dec-2017, tatu: No special settings beyond base class ones, so:
return new IonFactory(this);
}

/*
/**********************************************************
/* Configuration: Ion-specific
/**********************************************************
*/

public IonFactoryBuilder withBinaryWriters() {
_createBinaryWriters = true;
Expand All @@ -60,6 +88,76 @@ public IonFactoryBuilder ionSystem(IonSystem system) {
return this;
}

/*
/**********************************************************
/* Configuration: on/off features
/**********************************************************
*/

// // // Parser features

public IonFactoryBuilder enable(IonParser.Feature f) {
_formatParserFeatures |= f.getMask();
return _this();
}

public IonFactoryBuilder enable(IonParser.Feature first, IonParser.Feature... other) {
_formatParserFeatures |= first.getMask();
for (IonParser.Feature f : other) {
_formatParserFeatures |= f.getMask();
}
return _this();
}

public IonFactoryBuilder disable(IonParser.Feature f) {
_formatParserFeatures &= ~f.getMask();
return _this();
}

public IonFactoryBuilder disable(IonParser.Feature first, IonParser.Feature... other) {
_formatParserFeatures &= ~first.getMask();
for (IonParser.Feature f : other) {
_formatParserFeatures &= ~f.getMask();
}
return _this();
}

public IonFactoryBuilder configure(IonParser.Feature f, boolean state) {
return state ? enable(f) : disable(f);
}

// // // Generator features

public IonFactoryBuilder enable(IonGenerator.Feature f) {
_formatGeneratorFeatures |= f.getMask();
return _this();
}

public IonFactoryBuilder enable(IonGenerator.Feature first, IonGenerator.Feature... other) {
_formatGeneratorFeatures |= first.getMask();
for (IonGenerator.Feature f : other) {
_formatGeneratorFeatures |= f.getMask();
}
return _this();
}

public IonFactoryBuilder disable(IonGenerator.Feature f) {
_formatGeneratorFeatures &= ~f.getMask();
return _this();
}

public IonFactoryBuilder disable(IonGenerator.Feature first, IonGenerator.Feature... other) {
_formatGeneratorFeatures &= ~first.getMask();
for (IonGenerator.Feature f : other) {
_formatGeneratorFeatures &= ~f.getMask();
}
return _this();
}

public IonFactoryBuilder configure(IonGenerator.Feature f, boolean state) {
return state ? enable(f) : disable(f);
}

/*
/**********************************************************
/* Accessors
Expand All @@ -75,9 +173,6 @@ public IonSystem ionSystem() {
return _system;
}

@Override
public IonFactory build() {
// 28-Dec-2017, tatu: No special settings beyond base class ones, so:
return new IonFactory(this);
}
public int formatParserFeaturesMask() { return _formatParserFeatures; }
public int formatGeneratorFeaturesMask() { return _formatGeneratorFeatures; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -257,14 +257,12 @@ public IonValue writeValueAsIonValue(Object value) throws IOException
{
IonFactory f = getFactory();
IonDatagram container = f._system.newDatagram();
IonWriter writer = f._system.newWriter(container);
try {

try (IonWriter writer = f._system.newWriter(container)) {
writeValue(writer, value);
IonValue result = container.get(0);
result.removeFromContainer();
return result;
} finally {
writer.close();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.amazon.ion.system.IonSystemBuilder;
import com.amazon.ion.util.Equivalence;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.dataformat.ion.IonFactory;
import com.fasterxml.jackson.dataformat.ion.IonGenerator;
import com.fasterxml.jackson.dataformat.ion.IonObjectMapper;
import org.junit.Assert;
Expand Down Expand Up @@ -51,9 +52,12 @@ public void testNativeTypeIdsEnabledOnWriteByDefault() throws IOException {


@Test
public void testNativeTypeIdsCanBeDisabledOnWrite() throws IOException {
IonObjectMapper mapper = new IonObjectMapper()
.disable(IonGenerator.Feature.USE_NATIVE_TYPE_ID);
public void mapper() throws IOException {
IonObjectMapper mapper = new IonObjectMapper(
IonFactory.builderForTextualWriters()
.disable(IonGenerator.Feature.USE_NATIVE_TYPE_ID)
.build()
);

IonValue subclassAsIon = mapper.writeValueAsIonValue(subclass);
assertEqualIonValues(SUBCLASS_TYPED_AS_PROPERTY, subclassAsIon);
Expand All @@ -71,8 +75,11 @@ public void testNativeTypeIdsDisabledStillReadsNativeTypesSuccessfully() throws

assertEqualIonValues(SUBCLASS_TYPED_BY_ANNOTATION, subclassAsIon);

IonObjectMapper reader = new IonObjectMapper()
.disable(IonGenerator.Feature.USE_NATIVE_TYPE_ID);
IonObjectMapper reader = new IonObjectMapper(
IonFactory.builderForTextualWriters()
.disable(IonGenerator.Feature.USE_NATIVE_TYPE_ID)
.build()
);

BaseClass roundTripInstance = reader.readValue(subclassAsIon, BaseClass.class);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,6 @@ public SmileFactory(SmileFactory src, ObjectCodec oc)

/**
* Constructors used by {@link SmileFactoryBuilder} for instantiation.
*
* @since 3.0
*/
protected SmileFactory(SmileFactoryBuilder b) {
super(b, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ public SmileFactoryBuilder(SmileFactory base) {
_formatGeneratorFeatures = base._smileGeneratorFeatures;
}

@Override
public SmileFactory build() {
// 28-Dec-2017, tatu: No special settings beyond base class ones, so:
return new SmileFactory(this);
}

// // // Parser features

public SmileFactoryBuilder enable(SmileParser.Feature f) {
Expand Down Expand Up @@ -112,10 +118,4 @@ public SmileFactoryBuilder configure(SmileGenerator.Feature f, boolean state) {

public int formatParserFeaturesMask() { return _formatParserFeatures; }
public int formatGeneratorFeaturesMask() { return _formatGeneratorFeatures; }

@Override
public SmileFactory build() {
// 28-Dec-2017, tatu: No special settings beyond base class ones, so:
return new SmileFactory(this);
}
}

0 comments on commit 1b3f33e

Please sign in to comment.