Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/main/java/fold/io/CustomFoldReader.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fold.io;

import com.fasterxml.jackson.jr.ob.JSON;
import fold.model.FoldFile;

import java.io.IOException;
Expand Down Expand Up @@ -35,9 +36,13 @@ public CustomFoldReader(Class<T> tClass, InputStream inputStream) {
*/
public T read() throws FoldFileFormatException {
try {
return json.beanFrom(tClass, inputStream);
return getJson().beanFrom(tClass, inputStream);
} catch (IOException e) {
throw new FoldFileFormatException(e);
}
}

protected JSON getJson() {
return json;
}
}
27 changes: 27 additions & 0 deletions src/main/java/fold/io/LenientFoldReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package fold.io;

import com.fasterxml.jackson.jr.ob.JSON;
import fold.model.FoldFile;

import java.io.InputStream;

import static fold.io.impl.Fold.lenient;

/**
* Does not throw an exception when unexpected fields are encountered.
*/
public class LenientFoldReader extends CustomFoldReader<FoldFile> {
/**
* Create a new FoldReader from an InputStream.
*
* @param inputStream The InputStream to read from when reading this FoldFile.
*/
public LenientFoldReader(InputStream inputStream) {
super(FoldFile.class, inputStream);
}

@Override
protected JSON getJson() {
return lenient;
}
}
7 changes: 6 additions & 1 deletion src/main/java/fold/io/impl/Fold.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
public class Fold {
public static JSON json = JSON.builder()
.register(new JrSimpleTreeExtension())
.register(new FoldJacksonJrExtension())
.register(new FoldJacksonJrExtension(true))
.build();

public static final JSON lenient = JSON.builder()
.register(new JrSimpleTreeExtension())
.register(new FoldJacksonJrExtension(false))
.build();
}
6 changes: 4 additions & 2 deletions src/main/java/fold/io/impl/FoldFileValueReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@

class FoldFileValueReader<T extends FoldFile> extends ValueReader {
private final Class<T> type;
private final boolean strict;

public FoldFileValueReader(Class<T> type) {
public FoldFileValueReader(Class<T> type, boolean strict) {
super(FoldFile.class);
this.type = type;
this.strict = strict;
}

@Override
Expand All @@ -27,7 +29,7 @@ public Object read(JSONReader reader, JsonParser p) throws IOException {
throw new RuntimeException(e);
}

FoldFrameValueReader.FoldFrameFactory foldFrameFactory = new FoldFrameValueReader.FoldFrameFactory(instance.getRootFrame());
FoldFrameValueReader.FoldFrameFactory foldFrameFactory = new FoldFrameValueReader.FoldFrameFactory(instance.getRootFrame(), strict);

String fieldName;
while ((fieldName = p.nextFieldName()) != null) {
Expand Down
15 changes: 11 additions & 4 deletions src/main/java/fold/io/impl/FoldFrameValueReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@
import java.util.List;

class FoldFrameValueReader extends ValueReader {
public FoldFrameValueReader() {
private final boolean strict;

public FoldFrameValueReader(boolean strict) {
super(FoldFrame.class);
this.strict = strict;
}

private static <T> List<List<T>> readListListOf(Class<T> type, JSONReader reader, JsonParser p) throws IOException {
Expand Down Expand Up @@ -128,7 +131,7 @@ public Object read(JSONReader reader, JsonParser p) throws IOException {

String fieldName;

FoldFrameFactory foldFrameFactory = new FoldFrameFactory(frame);
FoldFrameFactory foldFrameFactory = new FoldFrameFactory(frame, strict);

while ((fieldName = p.nextFieldName()) != null) {
foldFrameFactory.readField(fieldName, reader, p);
Expand All @@ -141,6 +144,7 @@ public Object read(JSONReader reader, JsonParser p) throws IOException {

public static class FoldFrameFactory {
private final FoldFrame instance;
private final boolean strict;
List<List<Double>> vertices_coords = new ArrayList<>();
List<List<Integer>> vertices_vertices = new ArrayList<>();
List<List<Integer>> vertices_edges = new ArrayList<>();
Expand All @@ -159,8 +163,9 @@ public static class FoldFrameFactory {
List<List<Integer>> edgeOrders = new ArrayList<>();
List<List<Integer>> faceOrders = new ArrayList<>();

public FoldFrameFactory(FoldFrame instance) {
public FoldFrameFactory(FoldFrame instance, boolean strict) {
this.instance = instance;
this.strict = strict;
}

public void readField(String fieldName, JSONReader reader, JsonParser p) throws IOException {
Expand Down Expand Up @@ -231,7 +236,9 @@ public void readField(String fieldName, JSONReader reader, JsonParser p) throws
faceOrders = readListListOf(Integer.class, reader, p);
break;
default:
throw new FoldFileFormatException("Field \"" + fieldName + "\" not valid");
if (strict) {
throw new FoldFileFormatException("Field \"" + fieldName + "\" not valid");
}
}
}

Expand Down
12 changes: 9 additions & 3 deletions src/main/java/fold/io/impl/FoldJacksonJrExtension.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,25 @@
import fold.model.FoldFrame;

class FoldJacksonJrExtension extends JacksonJrExtension {
private final boolean strict;

public FoldJacksonJrExtension(boolean strict) {
this.strict = strict;
}

@Override
protected void register(ExtensionContext ctx) {
ctx.appendProvider(new FoldHandlerProvider());
}

private static class FoldHandlerProvider extends ReaderWriterProvider {
private class FoldHandlerProvider extends ReaderWriterProvider {
@SuppressWarnings("unchecked")
public ValueReader findValueReader(JSONReader readContext, Class<?> type) {
if (type == FoldFrame.class) {
return new FoldFrameValueReader();
return new FoldFrameValueReader(strict);
}
if (FoldFile.class.isAssignableFrom(type)) {
return new FoldFileValueReader<>((Class<FoldFile>) type);
return new FoldFileValueReader<>((Class<FoldFile>) type, strict);
}
return null;
}
Expand Down
37 changes: 37 additions & 0 deletions src/test/java/fold/StrictTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package fold;

import fold.io.FoldFileFormatException;
import fold.io.FoldReader;
import fold.io.LenientFoldReader;
import fold.model.FoldFile;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileInputStream;
import java.util.Objects;

public class StrictTest {
@Test
public void testReadNonStrict() throws Exception {
File saveFile = new File(Objects.requireNonNull(getClass().getClassLoader().getResource("fold/extra_fields.fold")).getFile());

FoldFile foldFile;
try (FileInputStream inputStream = new FileInputStream(saveFile)) {
LenientFoldReader foldReader = new LenientFoldReader(inputStream);
foldFile = foldReader.read();
}

Assertions.assertEquals(1.2, foldFile.getSpec());
}

@Test
public void testReadStrict() throws Exception {
File saveFile = new File(Objects.requireNonNull(getClass().getClassLoader().getResource("fold/extra_fields.fold")).getFile());

try (FileInputStream inputStream = new FileInputStream(saveFile)) {
FoldReader foldReader = new FoldReader(inputStream);
Assertions.assertThrows(FoldFileFormatException.class, foldReader::read);
}
}
}
10 changes: 10 additions & 0 deletions src/test/resources/fold/extra_fields.fold
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"file_spec": 1.2,
"version": 1.2,
"file_creator": "Crease Pattern Editor",
"file_classes": [
"singleModel"
],
"file_author": "test",
"file_description": "The description"
}