Skip to content

Commit dd0a3b2

Browse files
Internal refactoring to how Resources are serialized/deserialized in a Package.
Added getDataAsJson()/getDataAsCsv() methods to Resources so users are able to retrieve all data in a specified format in one go.
1 parent 8ceec6b commit dd0a3b2

23 files changed

+397
-80
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>io.frictionlessdata</groupId>
66
<artifactId>datapackage-java</artifactId>
7-
<version>0.8.0-SNAPSHOT</version>
7+
<version>0.8.1-SNAPSHOT</version>
88
<packaging>jar</packaging>
99
<issueManagement>
1010
<url>https://github.com/frictionlessdata/datapackage-java/issues</url>
@@ -23,7 +23,7 @@
2323
<maven.compiler.source>${java.version}</maven.compiler.source>
2424
<maven.compiler.target>${java.version}</maven.compiler.target>
2525
<maven.compiler.compiler>${java.version}</maven.compiler.compiler>
26-
<tableschema-java-version>0.8.0</tableschema-java-version>
26+
<tableschema-java-version>0.8.1</tableschema-java-version>
2727
<junit.version>5.12.0</junit.version>
2828
<slf4j-simple.version>2.0.17</slf4j-simple.version>
2929
<apache-commons-collections4.version>4.4</apache-commons-collections4.version>

src/main/java/io/frictionlessdata/datapackage/Contributor.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
package io.frictionlessdata.datapackage;
22

33
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
4-
import com.fasterxml.jackson.core.JsonParseException;
54
import com.fasterxml.jackson.core.type.TypeReference;
65
import com.fasterxml.jackson.databind.JsonNode;
76
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
87
import com.fasterxml.jackson.databind.node.ArrayNode;
98
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
10-
import io.frictionlessdata.tableschema.exception.JsonParsingException;
119
import io.frictionlessdata.tableschema.util.JsonUtil;
1210
import org.apache.commons.lang3.StringUtils;
1311

1412
import java.net.MalformedURLException;
1513
import java.net.URL;
16-
import java.util.*;
17-
18-
import static io.frictionlessdata.datapackage.Validator.isValidUrl;
14+
import java.util.Collection;
15+
import java.util.Objects;
1916

2017
@JsonPropertyOrder({
2118
"title",

src/main/java/io/frictionlessdata/datapackage/JSONBase.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.frictionlessdata.datapackage;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import com.fasterxml.jackson.annotation.JsonInclude;
45
import com.fasterxml.jackson.annotation.JsonInclude.Include;
56
import com.fasterxml.jackson.core.type.TypeReference;
@@ -54,6 +55,7 @@ public abstract class JSONBase implements BaseInterface {
5455
/**
5556
* If true, we are reading from an archive format, eg. ZIP
5657
*/
58+
@JsonIgnore
5759
boolean isArchivePackage = false;
5860
// Metadata properties.
5961
// Required properties.
@@ -74,9 +76,7 @@ public abstract class JSONBase implements BaseInterface {
7476
private List<Source> sources = null;
7577
private List<License> licenses = null;
7678

77-
// Schema
78-
private Schema schema = null;
79-
79+
@JsonIgnore
8080
protected Map<String, String> originalReferences = new HashMap<>();
8181
/**
8282
* @return the name
@@ -154,10 +154,6 @@ public abstract class JSONBase implements BaseInterface {
154154
*/
155155
public void setHash(String hash){this.hash = hash;}
156156

157-
public Schema getSchema(){return schema;}
158-
159-
public void setSchema(Schema schema){this.schema = schema;}
160-
161157
public List<Source> getSources(){
162158
return sources;
163159
}
@@ -175,7 +171,7 @@ public void setSources(List<Source> sources){
175171
*/
176172
public void setLicenses(List<License> licenses){this.licenses = licenses;}
177173

178-
174+
@JsonIgnore
179175
public Map<String, String> getOriginalReferences() {
180176
return originalReferences;
181177
}
@@ -225,7 +221,7 @@ private static FileReference referenceFromJson(JsonNode resourceJson, String key
225221
return ref;
226222
}
227223

228-
public static void setFromJson(JsonNode resourceJson, JSONBase retVal, Schema schema) {
224+
public static void setFromJson(JsonNode resourceJson, JSONBase retVal) {
229225
if (resourceJson.has(JSONBase.JSON_KEY_SCHEMA) && resourceJson.get(JSONBase.JSON_KEY_SCHEMA).isTextual())
230226
retVal.originalReferences.put(JSONBase.JSON_KEY_SCHEMA, resourceJson.get(JSONBase.JSON_KEY_SCHEMA).asText());
231227
if (resourceJson.has(JSONBase.JSON_KEY_DIALECT) && resourceJson.get(JSONBase.JSON_KEY_DIALECT).isTextual())
@@ -251,7 +247,6 @@ public static void setFromJson(JsonNode resourceJson, JSONBase retVal, Schema sc
251247
}
252248

253249
retVal.setName(name);
254-
retVal.setSchema(schema);
255250
retVal.setProfile(profile);
256251
retVal.setTitle(title);
257252
retVal.setDescription(description);

src/main/java/io/frictionlessdata/datapackage/Package.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.annotation.JsonProperty;
77
import com.fasterxml.jackson.core.type.TypeReference;
88
import com.fasterxml.jackson.databind.JsonNode;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
910
import com.fasterxml.jackson.databind.node.ArrayNode;
1011
import com.fasterxml.jackson.databind.node.ObjectNode;
1112
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
@@ -708,7 +709,8 @@ protected ObjectNode getJsonNode(){
708709
// this is ugly. If we encounter a DataResource which should be written to a file via
709710
// manual setting, do some trickery to not write the DataResource, but a curated version
710711
// to the package descriptor.
711-
ObjectNode obj = (ObjectNode) JsonUtil.getInstance().createNode(resource.getJson());
712+
ObjectMapper mapper = JsonUtil.getInstance().getMapper();
713+
ObjectNode obj = mapper.convertValue(resource, ObjectNode.class);
712714
if ((resource instanceof AbstractDataResource) && (resource.shouldSerializeToFile())) {
713715
Set<String> datafileNames = resource.getDatafileNamesForWriting();
714716
Set<String> outPaths = datafileNames.stream().map((r) -> r+"."+resource.getSerializationFormat()).collect(Collectors.toSet());
@@ -781,8 +783,7 @@ private void setJson(ObjectNode jsonNodeSource) throws Exception {
781783
this.errors.add(dpe);
782784
}
783785
}
784-
Schema schema = buildSchema (jsonNodeSource, basePath, isArchivePackage);
785-
setFromJson(jsonNodeSource, this, schema);
786+
setFromJson(jsonNodeSource, this);
786787
this.setId(textValueOrNull(jsonNodeSource, Package.JSON_KEY_ID));
787788
this.setName(textValueOrNull(jsonNodeSource, Package.JSON_KEY_NAME));
788789
this.setVersion(textValueOrNull(jsonNodeSource, Package.JSON_KEY_VERSION));

src/main/java/io/frictionlessdata/datapackage/fk/PackageForeignKey.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import io.frictionlessdata.tableschema.fk.Reference;
1010
import io.frictionlessdata.tableschema.schema.Schema;
1111

12-
import java.util.*;
12+
import java.util.ArrayList;
13+
import java.util.List;
1314

1415
/**
1516
* PackageForeignKey is a wrapper around the ForeignKey class to validate foreign keys

src/main/java/io/frictionlessdata/datapackage/resource/AbstractDataResource.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.frictionlessdata.datapackage.resource;
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
46
import io.frictionlessdata.datapackage.Dialect;
57
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
68
import io.frictionlessdata.tableschema.Table;
@@ -18,7 +20,9 @@
1820
*
1921
* @param <T> the data format, either CSV or JSON array
2022
*/
21-
public abstract class AbstractDataResource<T,C> extends AbstractResource<T> {
23+
@JsonInclude(value= JsonInclude.Include. NON_EMPTY, content= JsonInclude.Include. NON_NULL)
24+
public abstract class AbstractDataResource<T> extends AbstractResource<T> {
25+
@JsonIgnore
2226
T data;
2327

2428
AbstractDataResource(String name, T data) {
@@ -33,8 +37,8 @@ public abstract class AbstractDataResource<T,C> extends AbstractResource<T> {
3337
/**
3438
* @return the data
3539
*/
36-
@JsonIgnore
3740
@Override
41+
@JsonProperty(JSON_KEY_DATA)
3842
public Object getRawData() throws IOException {
3943
return data;
4044
}
@@ -47,6 +51,7 @@ public void setDataPoperty(T data) {
4751
}
4852

4953
@Override
54+
@JsonIgnore
5055
List<Table> readData () throws Exception{
5156
List<Table> tables = new ArrayList<>();
5257
if (data != null){
@@ -94,5 +99,6 @@ public void writeDataAsCsv(Path outputDir, Dialect dialect) throws Exception {
9499
writeTableAsCsv(tables.get(0), lDialect, p);
95100
}
96101

102+
@JsonIgnore
97103
abstract String getResourceFormat();
98104
}

src/main/java/io/frictionlessdata/datapackage/resource/AbstractReferencebasedResource.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package io.frictionlessdata.datapackage.resource;
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
46
import com.fasterxml.jackson.databind.JsonNode;
57
import io.frictionlessdata.tableschema.Table;
68
import io.frictionlessdata.tableschema.tabledatasource.TableDataSource;
79
import io.frictionlessdata.tableschema.util.JsonUtil;
810

911
import java.io.ByteArrayOutputStream;
10-
import java.io.File;
1112
import java.io.IOException;
1213
import java.io.InputStream;
1314
import java.util.*;
1415
import java.util.stream.Collectors;
1516

16-
public abstract class AbstractReferencebasedResource<T,C> extends AbstractResource<T> {
17+
@JsonInclude(value= JsonInclude.Include. NON_EMPTY, content= JsonInclude.Include. NON_NULL)
18+
public abstract class AbstractReferencebasedResource<T> extends AbstractResource<T> {
1719
Collection<T> paths;
1820

1921
AbstractReferencebasedResource(String name, Collection<T> paths) {
@@ -30,8 +32,8 @@ public Collection<String> getReferencesAsStrings() {
3032
return strings;
3133
}
3234

33-
@JsonIgnore
3435
@Override
36+
@JsonIgnore
3537
public Object getRawData() throws IOException {
3638
// If the path(s) of data file/URLs has been set.
3739
if (paths != null){
@@ -55,7 +57,7 @@ public Object getRawData() throws IOException {
5557
if more than one path in our paths object, return a JSON array,
5658
else just that one object.
5759
*/
58-
@JsonIgnore
60+
@JsonProperty(JSON_KEY_PATH)
5961
JsonNode getPathJson() {
6062
List<String> path = new ArrayList<>(getReferencesAsStrings());
6163
if (path.size() == 1) {

0 commit comments

Comments
 (0)