diff --git a/pom.xml b/pom.xml
index 01728f5..cbaf010 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
io.frictionlessdata
datapackage-java
- 0.8.0-SNAPSHOT
+ 0.8.1-SNAPSHOT
jar
https://github.com/frictionlessdata/datapackage-java/issues
@@ -23,7 +23,7 @@
${java.version}
${java.version}
${java.version}
- 0.8.0
+ 0.8.1
5.12.0
2.0.17
4.4
diff --git a/src/main/java/io/frictionlessdata/datapackage/Contributor.java b/src/main/java/io/frictionlessdata/datapackage/Contributor.java
index 89def6f..5a5c528 100644
--- a/src/main/java/io/frictionlessdata/datapackage/Contributor.java
+++ b/src/main/java/io/frictionlessdata/datapackage/Contributor.java
@@ -1,21 +1,18 @@
package io.frictionlessdata.datapackage;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.fasterxml.jackson.databind.node.ArrayNode;
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
-import io.frictionlessdata.tableschema.exception.JsonParsingException;
import io.frictionlessdata.tableschema.util.JsonUtil;
import org.apache.commons.lang3.StringUtils;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.*;
-
-import static io.frictionlessdata.datapackage.Validator.isValidUrl;
+import java.util.Collection;
+import java.util.Objects;
@JsonPropertyOrder({
"title",
diff --git a/src/main/java/io/frictionlessdata/datapackage/JSONBase.java b/src/main/java/io/frictionlessdata/datapackage/JSONBase.java
index da54544..89bd310 100644
--- a/src/main/java/io/frictionlessdata/datapackage/JSONBase.java
+++ b/src/main/java/io/frictionlessdata/datapackage/JSONBase.java
@@ -1,5 +1,6 @@
package io.frictionlessdata.datapackage;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -54,6 +55,7 @@ public abstract class JSONBase implements BaseInterface {
/**
* If true, we are reading from an archive format, eg. ZIP
*/
+ @JsonIgnore
boolean isArchivePackage = false;
// Metadata properties.
// Required properties.
@@ -74,9 +76,7 @@ public abstract class JSONBase implements BaseInterface {
private List sources = null;
private List licenses = null;
- // Schema
- private Schema schema = null;
-
+ @JsonIgnore
protected Map originalReferences = new HashMap<>();
/**
* @return the name
@@ -154,10 +154,6 @@ public abstract class JSONBase implements BaseInterface {
*/
public void setHash(String hash){this.hash = hash;}
- public Schema getSchema(){return schema;}
-
- public void setSchema(Schema schema){this.schema = schema;}
-
public List getSources(){
return sources;
}
@@ -175,7 +171,7 @@ public void setSources(List sources){
*/
public void setLicenses(List licenses){this.licenses = licenses;}
-
+ @JsonIgnore
public Map getOriginalReferences() {
return originalReferences;
}
@@ -225,7 +221,7 @@ private static FileReference referenceFromJson(JsonNode resourceJson, String key
return ref;
}
- public static void setFromJson(JsonNode resourceJson, JSONBase retVal, Schema schema) {
+ public static void setFromJson(JsonNode resourceJson, JSONBase retVal) {
if (resourceJson.has(JSONBase.JSON_KEY_SCHEMA) && resourceJson.get(JSONBase.JSON_KEY_SCHEMA).isTextual())
retVal.originalReferences.put(JSONBase.JSON_KEY_SCHEMA, resourceJson.get(JSONBase.JSON_KEY_SCHEMA).asText());
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
}
retVal.setName(name);
- retVal.setSchema(schema);
retVal.setProfile(profile);
retVal.setTitle(title);
retVal.setDescription(description);
diff --git a/src/main/java/io/frictionlessdata/datapackage/Package.java b/src/main/java/io/frictionlessdata/datapackage/Package.java
index faef228..fec2546 100644
--- a/src/main/java/io/frictionlessdata/datapackage/Package.java
+++ b/src/main/java/io/frictionlessdata/datapackage/Package.java
@@ -6,6 +6,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
@@ -708,7 +709,8 @@ protected ObjectNode getJsonNode(){
// this is ugly. If we encounter a DataResource which should be written to a file via
// manual setting, do some trickery to not write the DataResource, but a curated version
// to the package descriptor.
- ObjectNode obj = (ObjectNode) JsonUtil.getInstance().createNode(resource.getJson());
+ ObjectMapper mapper = JsonUtil.getInstance().getMapper();
+ ObjectNode obj = mapper.convertValue(resource, ObjectNode.class);
if ((resource instanceof AbstractDataResource) && (resource.shouldSerializeToFile())) {
Set datafileNames = resource.getDatafileNamesForWriting();
Set outPaths = datafileNames.stream().map((r) -> r+"."+resource.getSerializationFormat()).collect(Collectors.toSet());
@@ -781,8 +783,7 @@ private void setJson(ObjectNode jsonNodeSource) throws Exception {
this.errors.add(dpe);
}
}
- Schema schema = buildSchema (jsonNodeSource, basePath, isArchivePackage);
- setFromJson(jsonNodeSource, this, schema);
+ setFromJson(jsonNodeSource, this);
this.setId(textValueOrNull(jsonNodeSource, Package.JSON_KEY_ID));
this.setName(textValueOrNull(jsonNodeSource, Package.JSON_KEY_NAME));
this.setVersion(textValueOrNull(jsonNodeSource, Package.JSON_KEY_VERSION));
diff --git a/src/main/java/io/frictionlessdata/datapackage/fk/PackageForeignKey.java b/src/main/java/io/frictionlessdata/datapackage/fk/PackageForeignKey.java
index c3249ff..c63cd12 100644
--- a/src/main/java/io/frictionlessdata/datapackage/fk/PackageForeignKey.java
+++ b/src/main/java/io/frictionlessdata/datapackage/fk/PackageForeignKey.java
@@ -9,7 +9,8 @@
import io.frictionlessdata.tableschema.fk.Reference;
import io.frictionlessdata.tableschema.schema.Schema;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
/**
* PackageForeignKey is a wrapper around the ForeignKey class to validate foreign keys
diff --git a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractDataResource.java b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractDataResource.java
index 6e5eb0d..24cf760 100644
--- a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractDataResource.java
+++ b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractDataResource.java
@@ -1,6 +1,8 @@
package io.frictionlessdata.datapackage.resource;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
import io.frictionlessdata.datapackage.Dialect;
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
import io.frictionlessdata.tableschema.Table;
@@ -18,7 +20,9 @@
*
* @param the data format, either CSV or JSON array
*/
-public abstract class AbstractDataResource extends AbstractResource {
+@JsonInclude(value= JsonInclude.Include. NON_EMPTY, content= JsonInclude.Include. NON_NULL)
+public abstract class AbstractDataResource extends AbstractResource {
+ @JsonIgnore
T data;
AbstractDataResource(String name, T data) {
@@ -33,8 +37,8 @@ public abstract class AbstractDataResource extends AbstractResource {
/**
* @return the data
*/
- @JsonIgnore
@Override
+ @JsonProperty(JSON_KEY_DATA)
public Object getRawData() throws IOException {
return data;
}
@@ -47,6 +51,7 @@ public void setDataPoperty(T data) {
}
@Override
+ @JsonIgnore
List readData () throws Exception{
List tables = new ArrayList<>();
if (data != null){
@@ -94,5 +99,6 @@ public void writeDataAsCsv(Path outputDir, Dialect dialect) throws Exception {
writeTableAsCsv(tables.get(0), lDialect, p);
}
+ @JsonIgnore
abstract String getResourceFormat();
}
diff --git a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractReferencebasedResource.java b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractReferencebasedResource.java
index 3b8429b..0342ed2 100644
--- a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractReferencebasedResource.java
+++ b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractReferencebasedResource.java
@@ -1,19 +1,21 @@
package io.frictionlessdata.datapackage.resource;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
import io.frictionlessdata.tableschema.Table;
import io.frictionlessdata.tableschema.tabledatasource.TableDataSource;
import io.frictionlessdata.tableschema.util.JsonUtil;
import java.io.ByteArrayOutputStream;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;
-public abstract class AbstractReferencebasedResource extends AbstractResource {
+@JsonInclude(value= JsonInclude.Include. NON_EMPTY, content= JsonInclude.Include. NON_NULL)
+public abstract class AbstractReferencebasedResource extends AbstractResource {
Collection paths;
AbstractReferencebasedResource(String name, Collection paths) {
@@ -30,8 +32,8 @@ public Collection getReferencesAsStrings() {
return strings;
}
- @JsonIgnore
@Override
+ @JsonIgnore
public Object getRawData() throws IOException {
// If the path(s) of data file/URLs has been set.
if (paths != null){
@@ -55,7 +57,7 @@ public Object getRawData() throws IOException {
if more than one path in our paths object, return a JSON array,
else just that one object.
*/
- @JsonIgnore
+ @JsonProperty(JSON_KEY_PATH)
JsonNode getPathJson() {
List path = new ArrayList<>(getReferencesAsStrings());
if (path.size() == 1) {
diff --git a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java
index 4138214..b705e76 100644
--- a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java
+++ b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java
@@ -3,17 +3,22 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import io.frictionlessdata.datapackage.Package;
import io.frictionlessdata.datapackage.Dialect;
import io.frictionlessdata.datapackage.JSONBase;
+import io.frictionlessdata.datapackage.Package;
import io.frictionlessdata.datapackage.Profile;
import io.frictionlessdata.datapackage.exceptions.DataPackageException;
import io.frictionlessdata.datapackage.exceptions.DataPackageValidationException;
import io.frictionlessdata.datapackage.fk.PackageForeignKey;
import io.frictionlessdata.tableschema.Table;
import io.frictionlessdata.tableschema.exception.ForeignKeyException;
+import io.frictionlessdata.tableschema.exception.JsonSerializingException;
+import io.frictionlessdata.tableschema.exception.TableIOException;
import io.frictionlessdata.tableschema.exception.TypeInferringException;
import io.frictionlessdata.tableschema.field.Field;
import io.frictionlessdata.tableschema.fk.ForeignKey;
@@ -24,8 +29,10 @@
import io.frictionlessdata.tableschema.schema.Schema;
import io.frictionlessdata.tableschema.tabledatasource.TableDataSource;
import io.frictionlessdata.tableschema.util.JsonUtil;
+import io.frictionlessdata.tableschema.util.TableSchemaUtil;
import org.apache.commons.collections4.iterators.IteratorChain;
import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
import java.io.IOException;
import java.io.Writer;
@@ -35,7 +42,6 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
-import java.util.stream.Collectors;
/**
* Abstract base implementation of a Resource.
@@ -45,17 +51,25 @@
public abstract class AbstractResource extends JSONBase implements Resource {
// Data properties.
+ @JsonIgnore
protected List tables;
+ @JsonProperty("format")
String format = null;
+ @JsonProperty("dialect")
Dialect dialect;
- // Schema
+ @JsonProperty("schema")
Schema schema = null;
+ @JsonIgnore
boolean serializeToFile = true;
+
+ @JsonIgnore
private String serializationFormat;
+
+ @JsonIgnore
final List errors = new ArrayList<>();
AbstractResource(String name){
@@ -64,6 +78,18 @@ public abstract class AbstractResource extends JSONBase implements Resource objectArrayIterator() throws Exception{
return this.objectArrayIterator(false, false);
@@ -220,6 +246,92 @@ public List