From 453f8c81cc2ab220c06ca087d898670a6dd813d6 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 8 Nov 2017 15:38:56 +0100 Subject: [PATCH 001/548] fix: allow all types of header items in ExecutionResult --- .../result/AttributeHeaderItem.java | 19 +++---- .../executeafm/result/ExecutionResult.java | 32 +++++------ .../executeafm/result/ResultHeaderItem.java | 42 +++++++++++++++ .../result/ResultMeasureHeaderItem.java | 41 ++++++++++++++ .../result/ResultTotalHeaderItem.java | 54 +++++++++++++++++++ .../result/ExecutionResultTest.groovy | 8 +-- .../result/ResultHeaderItemTest.groovy | 28 ++++++++++ .../result/ResultMeasureHeaderItemTest.groovy | 33 ++++++++++++ .../result/ResultTotalHeaderItemTest.groovy | 35 ++++++++++++ .../result/executionResultFull.json | 2 +- .../result/resultMeasureHeaderItem.json | 6 +++ .../result/resultTotalHeaderItem.json | 6 +++ 12 files changed, 273 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java create mode 100644 src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java create mode 100644 src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java create mode 100644 src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/result/ResultMeasureHeaderItemTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy create mode 100644 src/test/resources/executeafm/result/resultMeasureHeaderItem.json create mode 100644 src/test/resources/executeafm/result/resultTotalHeaderItem.json diff --git a/src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java b/src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java index 526454d68..012ef3eee 100644 --- a/src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java +++ b/src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java @@ -13,14 +13,16 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import static com.gooddata.executeafm.result.AttributeHeaderItem.NAME; + /** * Header item for attribute */ -@JsonTypeName("attributeHeaderItem") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -public class AttributeHeaderItem { +@JsonRootName(NAME) +public class AttributeHeaderItem extends ResultHeaderItem { + + static final String NAME = "attributeHeaderItem"; - private final String name; private final String uri; /** @@ -30,17 +32,10 @@ public class AttributeHeaderItem { */ @JsonCreator public AttributeHeaderItem(@JsonProperty("name") final String name, @JsonProperty("uri") final String uri) { - this.name = name; + super(name); this.uri = uri; } - /** - * @return item name - */ - public String getName() { - return name; - } - /** * @return item uri */ diff --git a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java index 04b7dc61d..d6b37f49a 100644 --- a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java +++ b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java @@ -34,7 +34,7 @@ public class ExecutionResult { @JsonProperty("data") private List data; - private List>> attributeHeaderItems; + private List>> headerItems; private List>> totals; /** @@ -61,17 +61,17 @@ public ExecutionResult(final String[][] data, final Paging paging) { * Creates new result * @param data result data * @param paging result paging - * @param attributeHeaderItems items for attribute headers, for each attribute in each dimension, there is a list of headers + * @param headerItems items for headers, for each header in each dimension, there is a list of header items * @param totals data of totals, for each total in each dimension, there is a list of total's values */ @JsonCreator ExecutionResult(@JsonProperty("data") final List data, @JsonProperty("paging") final Paging paging, - @JsonProperty("attributeHeaderItems") final List>> attributeHeaderItems, + @JsonProperty("headerItems") final List>> headerItems, @JsonProperty("totals") final List>> totals) { this.data = data; this.paging = paging; - this.attributeHeaderItems = attributeHeaderItems; + this.headerItems = headerItems; this.totals = totals; } @@ -83,29 +83,29 @@ public Paging getPaging() { } /** - * @return attribute header items, for each attribute in each dimension, there is a list of headers + * @return header items, for each header in each dimension, there is a list of header items */ - public List>> getAttributeHeaderItems() { - return attributeHeaderItems; + public List>> getHeaderItems() { + return headerItems; } /** - * Sets attribute header items, for each attribute in each dimension, there is a list of headers - * @param attributeHeaderItems header items + * Sets header items, for each header in each dimension, there is a list of header items + * @param headerItems header items */ - public void setAttributeHeaderItems(final List>> attributeHeaderItems) { - this.attributeHeaderItems = attributeHeaderItems; + public void setHeaderItems(final List>> headerItems) { + this.headerItems = headerItems; } /** - * Add attribute header items for next dimension (this method will add dimension in attribute header items) + * Add header items for next dimension (this method will add dimension in header items) * @param items header items for one dimension */ - public void addAttributeHeaderItems(final List> items) { - if (attributeHeaderItems == null) { - setAttributeHeaderItems(new ArrayList<>()); + public void addHeaderItems(final List> items) { + if (headerItems == null) { + setHeaderItems(new ArrayList<>()); } - attributeHeaderItems.add(items); + headerItems.add(items); } /** diff --git a/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java b/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java new file mode 100644 index 000000000..dea5c5423 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.gooddata.util.GoodDataToStringBuilder; + +import static com.gooddata.util.Validate.notEmpty; + +/** + * Represent header items available in {@link ExecutionResult} + */ +@JsonSubTypes({ + @JsonSubTypes.Type(value = AttributeHeaderItem.class, name = AttributeHeaderItem.NAME), + @JsonSubTypes.Type(value = ResultMeasureHeaderItem.class, name = ResultMeasureHeaderItem.NAME), + @JsonSubTypes.Type(value = ResultTotalHeaderItem.class, name = ResultTotalHeaderItem.NAME) +}) +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +public abstract class ResultHeaderItem { + + private final String name; + + protected ResultHeaderItem(final String name) { + this.name = notEmpty(name, "name"); + } + + /** + * @return header item name + */ + public String getName() { + return name; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } +} diff --git a/src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java b/src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java new file mode 100644 index 000000000..4fd098f89 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +import static com.gooddata.executeafm.result.ResultMeasureHeaderItem.NAME; + +/** + * Header item for measure + */ +@JsonRootName(NAME) +public class ResultMeasureHeaderItem extends ResultHeaderItem { + + static final String NAME = "measureHeaderItem"; + + private final int order; + + /** + * Creates new instance of given header name and order + * @param name header name + * @param order measure order within measureGroup + */ + @JsonCreator + public ResultMeasureHeaderItem(@JsonProperty("name") final String name, @JsonProperty("order") final int order) { + super(name); + this.order = order; + } + + /** + * @return measure order within measureGroup + */ + public int getOrder() { + return order; + } +} diff --git a/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java b/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java new file mode 100644 index 000000000..a6bfdf66c --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.md.report.Total; + +import static com.gooddata.executeafm.result.ResultTotalHeaderItem.NAME; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * Header item for total. + */ +@JsonRootName(NAME) +public class ResultTotalHeaderItem extends ResultHeaderItem { + + static final String NAME = "totalHeaderItem"; + + private final String type; + + /** + * Creates new instance of given header name and total type + * @param name header name + * @param type total type + */ + @JsonCreator + public ResultTotalHeaderItem(@JsonProperty("name") final String name, @JsonProperty("type") final String type) { + super(name); + this.type = notEmpty(type, "type"); + } + + /** + * Creates new instance of given header name and total type + * @param name header name + * @param type total type + */ + public ResultTotalHeaderItem(final String name, final Total type) { + super(name); + this.type = notNull(type, "type").toString(); + } + + /** + * @return type of total + */ + public String getType() { + return type; + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy index 54bc90ddc..97cedd2c0 100644 --- a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy @@ -56,7 +56,7 @@ class ExecutionResultTest extends Specification { result.paging.offset == [0] result.paging.total == [4] - def accountHeaderItems = result.attributeHeaderItems + def accountHeaderItems = result.headerItems accountHeaderItems[0][0][0].uri == '/gdc/md/FoodMartDemo/obj/124/elements?id=3200' accountHeaderItems[0][0][0].name == 'Cost of Goods Sold' accountHeaderItems[0][0][1].uri == '/gdc/md/FoodMartDemo/obj/124/elements?id=6000' @@ -71,12 +71,12 @@ class ExecutionResultTest extends Specification { def "should set properties"() { when: ExecutionResult result = new ExecutionResult([1] as String[], new Paging()) - result.addAttributeHeaderItems([[new AttributeHeaderItem("n", "u")]]) + result.addHeaderItems([[new AttributeHeaderItem("n", "u")]]) result.setTotals([[[1]]]) then: - result.getAttributeHeaderItems()[0][0][0].name == "n" - result.getAttributeHeaderItems()[0][0][0].uri == "u" + result.getHeaderItems()[0][0][0].name == "n" + result.getHeaderItems()[0][0][0].uri == "u" result.getTotals() == [[[1]]] } diff --git a/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy new file mode 100644 index 000000000..89f28e315 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import spock.lang.Specification +import spock.lang.Unroll + +import static com.gooddata.util.ResourceUtils.readObjectFromResource + +class ResultHeaderItemTest extends Specification { + + @Unroll + def "should deserialize as #type"() { + when: + ResultHeaderItem item = readObjectFromResource("/executeafm/result/${type}.json", ResultHeaderItem) + + then: + typeClass.isInstance(item) + item.toString() + + where: + typeClass << [AttributeHeaderItem, ResultMeasureHeaderItem, ResultTotalHeaderItem] + type = typeClass.simpleName.uncapitalize() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/ResultMeasureHeaderItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ResultMeasureHeaderItemTest.groovy new file mode 100644 index 000000000..a1ff30796 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/ResultMeasureHeaderItemTest.groovy @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class ResultMeasureHeaderItemTest extends Specification { + + private static final String MEASURE_HEADER_ITEM_JSON = 'executeafm/result/resultMeasureHeaderItem.json' + + def "should serialize"() { + expect: + that new ResultMeasureHeaderItem('Measure Name', 1), + jsonEquals(resource(MEASURE_HEADER_ITEM_JSON)) + } + + def "should deserialize"() { + when: + ResultMeasureHeaderItem item = readObjectFromResource("/$MEASURE_HEADER_ITEM_JSON", ResultMeasureHeaderItem) + + then: + item.name == 'Measure Name' + item.order == 1 + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy new file mode 100644 index 000000000..c4fd7d53b --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import com.gooddata.md.report.Total +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + + +class ResultTotalHeaderItemTest extends Specification { + + private static final String TOTAL_HEADER_ITEM_JSON = 'executeafm/result/resultTotalHeaderItem.json' + + def "should serialize"() { + expect: + that new ResultTotalHeaderItem('Some total', Total.AVG), + jsonEquals(resource(TOTAL_HEADER_ITEM_JSON)) + } + + def "should deserialize"() { + when: + ResultTotalHeaderItem item = readObjectFromResource("/$TOTAL_HEADER_ITEM_JSON", ResultTotalHeaderItem) + + then: + item.name == 'Some total' + item.type == 'avg' + } +} diff --git a/src/test/resources/executeafm/result/executionResultFull.json b/src/test/resources/executeafm/result/executionResultFull.json index db97584d4..07eb48cc0 100644 --- a/src/test/resources/executeafm/result/executionResultFull.json +++ b/src/test/resources/executeafm/result/executionResultFull.json @@ -17,7 +17,7 @@ 4 ] }, - "attributeHeaderItems": [ + "headerItems": [ [ [ { diff --git a/src/test/resources/executeafm/result/resultMeasureHeaderItem.json b/src/test/resources/executeafm/result/resultMeasureHeaderItem.json new file mode 100644 index 000000000..e4187bbd7 --- /dev/null +++ b/src/test/resources/executeafm/result/resultMeasureHeaderItem.json @@ -0,0 +1,6 @@ +{ + "measureHeaderItem": { + "name": "Measure Name", + "order": 1 + } +} \ No newline at end of file diff --git a/src/test/resources/executeafm/result/resultTotalHeaderItem.json b/src/test/resources/executeafm/result/resultTotalHeaderItem.json new file mode 100644 index 000000000..4ecfe0d2b --- /dev/null +++ b/src/test/resources/executeafm/result/resultTotalHeaderItem.json @@ -0,0 +1,6 @@ +{ + "totalHeaderItem": { + "name": "Some total", + "type": "avg" + } +} \ No newline at end of file From 86337c127938a59013853eaf3996caeadc73975c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 9 Nov 2017 20:05:04 +0100 Subject: [PATCH 002/548] fix: remove MeasureGroupHeader.totalItems Resolves #549 --- .../executeafm/response/AttributeHeader.java | 22 +++++++++++-- .../gooddata/executeafm/response/Header.java | 31 +------------------ .../response/MeasureGroupHeader.java | 21 +++++-------- .../response/MeasureGroupHeaderTest.groovy | 19 ------------ .../response/measureGroupHeaderFull.json | 20 ------------ 5 files changed, 29 insertions(+), 84 deletions(-) delete mode 100644 src/test/resources/executeafm/response/measureGroupHeaderFull.json diff --git a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java b/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java index 49a90e9b7..d63771863 100644 --- a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java +++ b/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java @@ -10,16 +10,18 @@ import com.fasterxml.jackson.annotation.JsonRootName; import com.gooddata.executeafm.afm.Afm; import com.gooddata.executeafm.afm.LocallyIdentifiable; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; /** * Header of an attribute. */ @JsonRootName(AttributeHeader.NAME) -public class AttributeHeader extends Header implements LocallyIdentifiable { +public class AttributeHeader implements Header, LocallyIdentifiable { static final String NAME = "attributeHeader"; @@ -28,6 +30,8 @@ public class AttributeHeader extends Header implements LocallyIdentifiable { private final String uri; private final String identifier; + private List totalItems; + /** * Creates new header * @param name name @@ -56,11 +60,11 @@ public AttributeHeader(@JsonProperty("name") final String name, @JsonProperty("uri") final String uri, @JsonProperty("identifier") final String identifier, @JsonProperty("totalItems") final List totalHeaderItems) { - super(totalHeaderItems); this.name = notEmpty(name, "name"); this.localIdentifier = notEmpty(localIdentifier, "localIdentifier"); this.uri = notEmpty(uri, "uri"); this.identifier = notEmpty(identifier, "identifier"); + this.totalItems = totalHeaderItems; } /** @@ -96,4 +100,18 @@ public String getUri() { public String getIdentifier() { return identifier; } + + /** + * Totals' headers belonging to the same level as this header. + * @return lists of totals' header + */ + public List getTotalItems() { + return totalItems; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + } diff --git a/src/main/java/com/gooddata/executeafm/response/Header.java b/src/main/java/com/gooddata/executeafm/response/Header.java index 1fce0785f..6a518e6f1 100644 --- a/src/main/java/com/gooddata/executeafm/response/Header.java +++ b/src/main/java/com/gooddata/executeafm/response/Header.java @@ -21,34 +21,5 @@ @JsonSubTypes.Type(value = MeasureGroupHeader.class, name = MeasureGroupHeader.NAME), @JsonSubTypes.Type(value = AttributeHeader.class, name = AttributeHeader.NAME) }) -public abstract class Header { - private List totalItems; - - /** - * Creates new header - */ - protected Header() { - } - - /** - * Creates new header of given total items - * @param totalItems total header items - */ - protected Header(final List totalItems) { - this.totalItems = totalItems; - } - - /** - * Totals' headers belonging to the same level as this header. - * @return lists of totals' header - */ - public List getTotalItems() { - return totalItems; - } - - @Override - public String toString() { - return GoodDataToStringBuilder.defaultToString(this); - } - +public interface Header { } diff --git a/src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java b/src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java index d12ae4e05..7231c2372 100644 --- a/src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java +++ b/src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -15,7 +16,7 @@ * Header of a measure group. */ @JsonRootName(MeasureGroupHeader.NAME) -public class MeasureGroupHeader extends Header { +public class MeasureGroupHeader implements Header { static final String NAME = "measureGroupHeader"; @@ -25,19 +26,8 @@ public class MeasureGroupHeader extends Header { * Creates new header * @param items header items */ - public MeasureGroupHeader(final List items) { - this.items = items; - } - - /** - * Creates new header - * @param items header items - * @param totalHeaderItems total header items - */ @JsonCreator - public MeasureGroupHeader(@JsonProperty("items") final List items, - @JsonProperty("totalItems") final List totalHeaderItems) { - super(totalHeaderItems); + public MeasureGroupHeader(@JsonProperty("items") final List items) { this.items = items; } @@ -48,4 +38,9 @@ public MeasureGroupHeader(@JsonProperty("items") final List i public List getItems() { return items; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/test/groovy/com/gooddata/executeafm/response/MeasureGroupHeaderTest.groovy b/src/test/groovy/com/gooddata/executeafm/response/MeasureGroupHeaderTest.groovy index 6dbf94bd1..549068144 100644 --- a/src/test/groovy/com/gooddata/executeafm/response/MeasureGroupHeaderTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/response/MeasureGroupHeaderTest.groovy @@ -15,13 +15,6 @@ import static spock.util.matcher.HamcrestSupport.that class MeasureGroupHeaderTest extends Specification { private static final String MEASURE_GROUP_HEADER_JSON = 'executeafm/response/measureGroupHeader.json' - private static final String MEASURE_GROUP_HEADER_FULL_JSON = 'executeafm/response/measureGroupHeaderFull.json' - - def "should serialize full"() { - expect: - that new MeasureGroupHeader([new MeasureHeaderItem('Name', '#,##0.00', 'm1')], [new TotalHeaderItem('sum')]), - jsonEquals(resource(MEASURE_GROUP_HEADER_FULL_JSON)) - } def "should serialize"() { expect: @@ -37,16 +30,4 @@ class MeasureGroupHeaderTest extends Specification { header.items?.size() == 1 header.items.first().localIdentifier == 'm1' } - - def "should deserialize full"() { - when: - MeasureGroupHeader header = readObjectFromResource("/$MEASURE_GROUP_HEADER_FULL_JSON", MeasureGroupHeader) - - then: - header.items?.size() == 1 - header.items.first().localIdentifier == 'm1' - header.totalItems.size() == 1 - header.totalItems.first().name == 'sum' - header.toString() - } } diff --git a/src/test/resources/executeafm/response/measureGroupHeaderFull.json b/src/test/resources/executeafm/response/measureGroupHeaderFull.json deleted file mode 100644 index b752e3181..000000000 --- a/src/test/resources/executeafm/response/measureGroupHeaderFull.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "measureGroupHeader": { - "items": [ - { - "measureHeaderItem": { - "name": "Name", - "format": "#,##0.00", - "localIdentifier": "m1" - } - } - ], - "totalItems": [ - { - "totalHeaderItem": { - "name": "sum" - } - } - ] - } -} \ No newline at end of file From e9209c60d751afaa5d3e1e3e469d279a87ab0eda Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 10 Nov 2017 12:30:35 +0100 Subject: [PATCH 003/548] [maven-release-plugin] prepare release gooddata-java-2.18.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f0bedd6e0..da2d2af47 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.18.2-SNAPSHOT + 2.18.2 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.18.2 From 8a54226e02b058fccfbea2cc4d0467d104310702 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 10 Nov 2017 12:30:35 +0100 Subject: [PATCH 004/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index da2d2af47..f49442bb5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.18.2 + 2.18.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.18.2 + HEAD From d062400684465feaa990d53c8aa270e384d2a0e7 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 10 Nov 2017 12:35:18 +0100 Subject: [PATCH 005/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5bc0378d8..c0dc9d26d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.18.0 + 2.18.2 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From b91b65c9f1c8af7a6813eddd4556087895a95202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Mos=CC=8Cko?= Date: Tue, 14 Nov 2017 14:37:21 +0100 Subject: [PATCH 006/548] Add option to list ordered totals #553 --- .../java/com/gooddata/md/report/Total.java | 12 ++++++ .../com/gooddata/md/report/TotalTest.groovy | 39 +++++++++++++++++++ .../com/gooddata/md/report/TotalTest.java | 27 ------------- 3 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 src/test/groovy/com/gooddata/md/report/TotalTest.groovy delete mode 100644 src/test/java/com/gooddata/md/report/TotalTest.java diff --git a/src/main/java/com/gooddata/md/report/Total.java b/src/main/java/com/gooddata/md/report/Total.java index 9b045105c..9b70de36a 100644 --- a/src/main/java/com/gooddata/md/report/Total.java +++ b/src/main/java/com/gooddata/md/report/Total.java @@ -9,6 +9,9 @@ import com.fasterxml.jackson.annotation.JsonValue; import org.springframework.util.StringUtils; +import java.util.Arrays; +import java.util.List; + import static com.gooddata.util.Validate.notNull; import static java.lang.String.format; @@ -41,4 +44,13 @@ public static Total of(String total) { e); } } + + /** + * Ordered list of totals + * + * @return ordered list of totals which refers to order of totals data returned by the executor in executionResult + */ + public static List orderedValues() { + return Arrays.asList(SUM, MAX, MIN, AVG, MED, NAT); + } } diff --git a/src/test/groovy/com/gooddata/md/report/TotalTest.groovy b/src/test/groovy/com/gooddata/md/report/TotalTest.groovy new file mode 100644 index 000000000..2ef7d90c3 --- /dev/null +++ b/src/test/groovy/com/gooddata/md/report/TotalTest.groovy @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.report + +import spock.lang.Specification + +import static com.gooddata.md.report.Total.AVG +import static com.gooddata.md.report.Total.MAX +import static com.gooddata.md.report.Total.MED +import static com.gooddata.md.report.Total.MIN +import static com.gooddata.md.report.Total.NAT +import static com.gooddata.md.report.Total.SUM + +class TotalTest extends Specification { + def "should throw exception for invalid total name"() { + when: + Total.of("UnknownValue") + + then: + def exception = thrown(UnsupportedOperationException) + exception.message ==~ /.*"UnknownValue".*/ + } + + def "should match valid total values"() { + expect: + Total.values().each { + it == Total.of(it.toString()) + } + } + + def "should return ordered list of totals"() { + expect: + Total.orderedValues().size() == 6 + Total.orderedValues() == [SUM, MAX, MIN, AVG, MED, NAT] + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/TotalTest.java b/src/test/java/com/gooddata/md/report/TotalTest.java deleted file mode 100644 index 9bae21b6d..000000000 --- a/src/test/java/com/gooddata/md/report/TotalTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.md.report; - -import org.testng.annotations.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; - -public class TotalTest { - - @Test(expectedExceptions = UnsupportedOperationException.class, - expectedExceptionsMessageRegExp = ".*\"unknownValue\".*") - public void ofShouldThrowForUnknown() throws Exception { - Total.of("unknownValue"); - } - - @Test - public void testOf() throws Exception { - for (Total total : Total.values()) { - assertThat(Total.of(total.toString()), is(total)); - } - } -} \ No newline at end of file From 2d93fd748a6847f05785c32d6a21a19a54a801ba Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Mon, 13 Nov 2017 11:09:54 +0100 Subject: [PATCH 007/548] Use updated gooddata-rest-common with new request_id message format --- pom.xml | 2 +- .../java/com/gooddata/util/ResponseErrorHandlerTest.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f49442bb5..26c3f37be 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ com.gooddata gooddata-rest-common - 1.0.1 + 1.1.0 com.gooddata diff --git a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java index 8903e1636..a8106ccaa 100644 --- a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java +++ b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java @@ -42,7 +42,7 @@ public void testHandleGdcError() throws Exception { final GoodDataRestException exc = assertException(response); - assertThat(exc.getMessage(), is("500: [requestId=REQ] MSG")); + assertThat(exc.getMessage(), is("500: [request_id=REQ] MSG")); assertThat(exc.getStatusCode(), is(500)); assertThat(exc.getRequestId(), is("REQ")); assertThat(exc.getComponent(), is("COMPONENT")); @@ -57,7 +57,7 @@ public void testHandleErrorStructure() throws Exception { final GoodDataRestException exc = assertException(response); - assertThat(exc.getMessage(), is("500: [requestId=REQ] MSG PARAM1 PARAM2 3")); + assertThat(exc.getMessage(), is("500: [request_id=REQ] MSG PARAM1 PARAM2 3")); assertThat(exc.getStatusCode(), is(500)); assertThat(exc.getRequestId(), is("REQ")); assertThat(exc.getComponent(), is("COMPONENT")); @@ -72,7 +72,7 @@ public void testHandleInvalidError() throws Exception { final GoodDataRestException exc = assertException(response); - assertThat(exc.getMessage(), is("500: [requestId=requestId] Unknown error")); + assertThat(exc.getMessage(), is("500: [request_id=requestId] Unknown error")); assertThat(exc.getStatusCode(), is(500)); assertThat(exc.getRequestId(), is("requestId")); assertThat(exc.getComponent(), is(nullValue())); @@ -126,4 +126,4 @@ private GoodDataRestException assertException(ClientHttpResponse response) { } } -} \ No newline at end of file +} From 637d55e3ad4412bab293b0739d56b24d190730b2 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Mon, 13 Nov 2017 10:50:50 +0100 Subject: [PATCH 008/548] Use latest gooddata-rest-common and remove moved classes --- pom.xml | 2 +- src/main/java/com/gooddata/GoodData.java | 7 +- .../gooddata/collections/MultiPageList.java | 300 ------------------ .../gooddata/util/ResponseErrorHandler.java | 4 +- .../collections/MultiPageListTest.java | 272 ---------------- .../util/ResponseErrorHandlerTest.java | 4 +- 6 files changed, 11 insertions(+), 578 deletions(-) delete mode 100644 src/main/java/com/gooddata/collections/MultiPageList.java delete mode 100644 src/test/java/com/gooddata/collections/MultiPageListTest.java diff --git a/pom.xml b/pom.xml index 26c3f37be..abc9f22a7 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ com.gooddata gooddata-rest-common - 1.1.0 + 1.2.0 com.gooddata diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index e38d2f8e9..5b8a4c47e 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -12,6 +12,7 @@ import com.gooddata.dataload.processes.ProcessService; import com.gooddata.export.ExportService; import com.gooddata.featureflag.FeatureFlagService; +import com.gooddata.gdc.Header; import com.gooddata.md.maintenance.ExportImportService; import com.gooddata.notification.NotificationService; import com.gooddata.projecttemplate.ProjectTemplateService; @@ -58,7 +59,11 @@ */ public class GoodData { - public static final String GDC_REQUEST_ID_HEADER = "X-GDC-REQUEST"; + /** + * @deprecated use {@link Header#GDC_REQUEST_ID} instead. + */ + @Deprecated + public static final String GDC_REQUEST_ID_HEADER = Header.GDC_REQUEST_ID; protected static final String PROTOCOL = GoodDataEndpoint.PROTOCOL; protected static final int PORT = GoodDataEndpoint.PORT; diff --git a/src/main/java/com/gooddata/collections/MultiPageList.java b/src/main/java/com/gooddata/collections/MultiPageList.java deleted file mode 100644 index a535c71b1..000000000 --- a/src/main/java/com/gooddata/collections/MultiPageList.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.collections; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.function.Function; - -import static java.util.stream.Collectors.toList; -import static org.apache.commons.lang3.Validate.notNull; - -/** - * Adapter over PageableList to offer easy iteration/streaming over multiple pages, - * lazily loading of pages using specified pageProvider. - */ -public class MultiPageList extends PageableList { - private final PageableList delegate; - private final Function> pageProvider; - - /** - * To list all the pages, starting with the very first one. - * - * @param pageProvider provider used to load the pages - */ - public MultiPageList(final Function> pageProvider) { - this(new PageRequest(), pageProvider); - } - - /** - * To list all the pages, starting with the startPage specified. - * - * @param startPage page to start with - * @param pageProvider provider used to load the pages - */ - public MultiPageList(final Page startPage, final Function> pageProvider) { - this(notNull(pageProvider, "pageProvider can't be null").apply(startPage), pageProvider); - } - - MultiPageList(final PageableList delegate, - final Function> pageProvider) { - this.delegate = notNull(delegate, "delegate can't be null"); - this.pageProvider = notNull(pageProvider, "pageProvider can't be null"); - } - - @Override - public Iterator iterator() { - return new PageIterator<>(delegate, pageProvider); - } - - /** - * Do not iterate over pages, get the current page items only - * - * @return the list of current page items only - */ - @Override - public List getCurrentPageItems() { - return delegate.getCurrentPageItems(); - } - - /** - * Iterate over multiple pages and collect the results to list - * - * @return list with all the results - */ - @Override - public List collectAll() { - return stream().collect(toList()); - } - - /** - * Returns description of the next page. - * - * @return next page, might be null - */ - @Override - public Page getNextPage() { - return delegate.getNextPage(); - } - - /** - * Signals whether there are more subsequent pages or the last page has been reached - * @return true if there are more results to come - */ - @Override - public boolean hasNextPage() { - return delegate.hasNextPage(); - } - - /** - * Returns map of links. - * - * @return map of links, might be null - */ - @Override - public Map getLinks() { - return delegate.getLinks(); - } - - /** - * Returns description of the current collection page. - * - * @return current collection page, might be null - */ - @Override - public Paging getPaging() { - return delegate.getPaging(); - } - - /** - * Returns size of the items collection on a current page. If you need the size of entire collection - * across all pages, use totalSize() instead. - * - * @return size of the items collection on a current page - */ - @Override - public int size() { - return delegate.size(); - } - - /** - * Returns size of entire collection across all pages. It will fetch all the pages, so use wisely. - * @return size of entire collection across all pages - */ - public int totalSize() { - return (int) stream().count(); - } - - @Override - public boolean isEmpty() { - return delegate.isEmpty(); - } - - /** - * Whether current page contains the specified object. If you need to verify whether entire collection - * across all pages contains the object, use stream().anyMatch(o) instead. - */ - @Override - public boolean contains(final Object o) { - return delegate.contains(o); - } - - @Override - public Object[] toArray() { - return delegate.toArray(); - } - - @Override - public T[] toArray(final T[] a) { - return delegate.toArray(a); - } - - @Override - public boolean add(final T item) { - return delegate.add(item); - } - - @Override - public boolean remove(final Object o) { - return delegate.remove(o); - } - - @Override - public boolean containsAll(final Collection c) { - return delegate.containsAll(c); - } - - @Override - public boolean addAll(final Collection c) { - return delegate.addAll(c); - } - - @Override - public boolean addAll(final int index, final Collection c) { - return delegate.addAll(index, c); - } - - @Override - public boolean removeAll(final Collection c) { - return delegate.removeAll(c); - } - - @Override - public boolean retainAll(final Collection c) { - return delegate.retainAll(c); - } - - @Override - public void clear() { - delegate.clear(); - } - - @Override - public T get(final int index) { - return delegate.get(index); - } - - @Override - public T set(final int index, final T element) { - return delegate.set(index, element); - } - - @Override - public void add(final int index, final T element) { - delegate.add(index, element); - } - - @Override - public T remove(final int index) { - return delegate.remove(index); - } - - @Override - public int indexOf(final Object o) { - return delegate.indexOf(o); - } - - @Override - public int lastIndexOf(final Object o) { - return delegate.lastIndexOf(o); - } - - @Override - public ListIterator listIterator() { - return delegate.listIterator(); - } - - @Override - public ListIterator listIterator(final int index) { - return delegate.listIterator(index); - } - - @Override - public List subList(final int fromIndex, final int toIndex) { - return delegate.subList(fromIndex, toIndex); - } - - @Override - public boolean equals(final Object o) { - return delegate.equals(o); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - private static final class PageIterator implements Iterator { - - private PageableList currentPage; - private Iterator pageItemsIterator; - private final Function> pageProvider; - - PageIterator(final PageableList currentPage, final Function> pageProvider) { - this.pageProvider = pageProvider; - this.currentPage = currentPage; - this.pageItemsIterator = currentPage.getItemsIterator(); - } - - @Override - public boolean hasNext() { - if (pageItemsIterator.hasNext()) { - return true; - } - - if (currentPage.getNextPage() == null) { - return false; - } - - final PageableList next = pageProvider.apply(currentPage.getNextPage()); - if (currentPage.getNextPage().equals(next.getNextPage())) { - throw new IllegalStateException("page provider does not iterate properly, returns the same page"); - } - - if (next.isEmpty() && next.getNextPage() != null) { - throw new IllegalStateException("page has no results, yet claims there is next page"); - } - - currentPage = next; - pageItemsIterator = currentPage.getItemsIterator(); - - return pageItemsIterator.hasNext(); - } - - @Override - public T next() { - if (!pageItemsIterator.hasNext()) { - throw new NoSuchElementException("no more items left"); - } - - return pageItemsIterator.next(); - } - } -} diff --git a/src/main/java/com/gooddata/util/ResponseErrorHandler.java b/src/main/java/com/gooddata/util/ResponseErrorHandler.java index 377c5150c..7c89fc085 100644 --- a/src/main/java/com/gooddata/util/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/util/ResponseErrorHandler.java @@ -7,6 +7,7 @@ import com.gooddata.GoodDataRestException; import com.gooddata.gdc.ErrorStructure; +import com.gooddata.gdc.Header; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageConverter; @@ -17,7 +18,6 @@ import java.io.IOException; import java.util.List; -import static com.gooddata.GoodData.GDC_REQUEST_ID_HEADER; import static com.gooddata.util.Validate.noNullElements; /** @@ -39,7 +39,7 @@ public void handleError(ClientHttpResponse response) { error = gdcErrorExtractor.extractData(response); } catch (RestClientException | IOException | HttpMessageConversionException ignored) { } - final String requestId = response.getHeaders().getFirst(GDC_REQUEST_ID_HEADER); + final String requestId = response.getHeaders().getFirst(Header.GDC_REQUEST_ID); int statusCode; try { statusCode = response.getRawStatusCode(); diff --git a/src/test/java/com/gooddata/collections/MultiPageListTest.java b/src/test/java/com/gooddata/collections/MultiPageListTest.java deleted file mode 100644 index 3837d1527..000000000 --- a/src/test/java/com/gooddata/collections/MultiPageListTest.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.collections; - -import org.testng.annotations.Test; - -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.function.Function; - -import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; -import static java.util.Collections.singletonList; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.core.Is.is; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.testng.Assert.fail; - -public class MultiPageListTest { - final MultiPageList singlePageList = new MultiPageList<>( - new PageableList<>(singletonList(11), null), - page -> null - ); - - final MultiPageList twoPageList = new MultiPageList<>( - new PageableList<>(singletonList(11), new Paging("nextpage2")), - page -> new PageableList<>(singletonList(12), null) - ); - - @Test - public void totalSize() { - assertThat(singlePageList.totalSize(), is(1)); - assertThat(twoPageList.totalSize(), is(2)); - } - - @Test - public void getCurrentPageItems() { - assertThat(singlePageList.getCurrentPageItems(), is(singletonList(11))); - assertThat(twoPageList.getCurrentPageItems(), is(singletonList(11))); - } - - @Test - public void collectAll() { - assertThat(singlePageList.collectAll(), is(singletonList(11))); - assertThat(twoPageList.collectAll(), is(asList(11, 12))); - } - - @Test - public void isEmpty() { - assertThat(new MultiPageList(page -> new PageableList<>()), is(empty())); - assertThat(singlePageList, is(not(empty()))); - assertThat(twoPageList, is(not(empty()))); - } - - @Test - public void iterator() { - final Iterator iterator = new MultiPageList<>( - new PageableList<>(singletonList(1), null), - page -> null - ).iterator(); - - assertThat(iterator.hasNext(), is(true)); - assertThat(iterator.next(), is(1)); - assertThat(iterator.hasNext(), is(false)); - try { - iterator.next(); - fail("expected NoSuchElementException"); - } catch (final NoSuchElementException ignored) { - } - } - - @Test - public void iteratorWithPageProvider() { - final PageableList lastPage = new PageableList<>(singletonList(3), null); - final PageableList list = new MultiPageList<>( - new PageableList<>(asList(1, 2), new Paging("next")), - page -> lastPage - ); - - final Iterator iterator = list.iterator(); - assertThat(iterator.hasNext(), is(true)); - assertThat(iterator.next(), is(1)); - assertThat(iterator.hasNext(), is(true)); - assertThat(iterator.next(), is(2)); - assertThat(iterator.hasNext(), is(true)); - assertThat(iterator.next(), is(3)); - - assertThat(iterator.hasNext(), is(false)); - try { - iterator.next(); - fail("expected NoSuchElementException"); - } catch (final NoSuchElementException ignored) { - } - } - - @Test - public void stream() { - final PageableList list = new MultiPageList<>( - new PageableList<>(asList(1, 2), null), - page -> null - ); - assertThat(list.stream().max(Integer::compareTo).orElse(0), is(2)); - } - - @Test - public void streamWithPageProvider() { - final PageableList lastPage = new PageableList<>(singletonList(3), null); - final PageableList list = new MultiPageList<>( - new PageableList<>(asList(1, 2), new Paging("next")), - page -> lastPage - ); - - assertThat(list.stream().max(Integer::compareTo).orElse(0), is(3)); - } - - @Test(expectedExceptions = IllegalStateException.class, - expectedExceptionsMessageRegExp = ".*page provider does not iterate properly, returns the same page.*") - public void infiniteLoopShouldBePrevented() { - final PageableList pageableList = new PageableList<>(asList(1, 2), new Paging("next")); - final PageableList list = new MultiPageList<>( - pageableList, - page -> pageableList - ); - - list.forEach((i) -> {}); - } - - @Test(expectedExceptions = IllegalStateException.class, - expectedExceptionsMessageRegExp = ".*page has no results, yet claims there is next page.*") - public void shouldFailOnMisbehavingNextPage() throws Exception { - final PageableList pageableList = new PageableList<>(asList(1, 2), new Paging("next")); - final PageableList misbehaving = mock(PageableList.class); - when(misbehaving.isEmpty()).thenReturn(true); - when(misbehaving.getNextPage()).thenReturn(new PageRequest()); - - final PageableList list = new MultiPageList<>( - pageableList, - page -> misbehaving - ); - list.forEach((i) -> {}); - } - - @Test - public void hasNextShouldOnlySwitchPageOnceAndOnlyOnce() { - final PageableList list = new MultiPageList<>( - new PageableList<>(emptyList(), new Paging("page2")), - new SinglePageProvider(new PageableList<>(singletonList(2), new Paging("page3"))) - ); - final Iterator iterator = list.iterator(); - - assertThat(iterator.hasNext(), is(true)); - assertThat(iterator.hasNext(), is(true)); - - assertThat(iterator.next(), is(2)); - - try { - iterator.hasNext(); - fail("expected that iterator will try to switch the page again, but it didn't happen"); - } catch (final IllegalStateException ignored) { - } - } - - @Test - public void testDelegateMethods() { - final PageableList delegate = mock(PageableList.class); - final MultiPageList list = new MultiPageList(delegate, page -> null); - - list.getNextPage(); - verify(delegate).getNextPage(); - - list.hasNextPage(); - verify(delegate).hasNextPage(); - - list.getLinks(); - verify(delegate).getLinks(); - - list.getPaging(); - verify(delegate).getPaging(); - - list.size(); - verify(delegate).size(); - - list.contains("x"); - verify(delegate).contains("x"); - - list.toArray(); - verify(delegate).toArray(); - - list.toArray(new Object[] {"x"}); - verify(delegate).toArray(new Object[] {"x"}); - - list.add("a"); - verify(delegate).add("a"); - - list.add(1, "a"); - verify(delegate).add(1, "a"); - - list.remove(0); - verify(delegate).remove(0); - - list.remove("b"); - verify(delegate).remove("b"); - - list.clear(); - verify(delegate).clear(); - - list.containsAll(asList("a", "b")); - verify(delegate).containsAll(asList("a", "b")); - - list.addAll(asList("a", "b")); - verify(delegate).addAll(asList("a", "b")); - - list.addAll(1, asList("a", "b")); - verify(delegate).addAll(1, asList("a", "b")); - - list.removeAll(asList("a", "b")); - verify(delegate).removeAll(asList("a", "b")); - - list.retainAll(asList("a", "b")); - verify(delegate).retainAll(asList("a", "b")); - - list.set(0, "x"); - verify(delegate).set(0, "x"); - - list.get(0); - verify(delegate).get(0); - - list.indexOf("x"); - verify(delegate).indexOf("x"); - - list.lastIndexOf("x"); - verify(delegate).lastIndexOf("x"); - - list.listIterator(); - verify(delegate).listIterator(); - - list.listIterator(1); - verify(delegate).listIterator(1); - - list.subList(0, 1); - verify(delegate).subList(0, 1); - } - - /** - * This provider will only provide one page, but will throw an exception when asked to provide another - */ - class SinglePageProvider implements Function> { - int count = 0; - final PageableList page; - - SinglePageProvider(final PageableList page) { - this.page = page; - } - - @Override - public PageableList apply(final Page page) { - count++; - if(count > 1) { - throw new IllegalStateException("second page has been requested"); - } - - return this.page; - } - } -} diff --git a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java index a8106ccaa..1840cdce0 100644 --- a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java +++ b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java @@ -5,8 +5,8 @@ */ package com.gooddata.util; -import com.gooddata.GoodData; import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.Header; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -104,7 +104,7 @@ private ClientHttpResponse prepareResponse(String resourcePath) throws IOExcepti final ClientHttpResponse response = prepareResponse(); final HttpHeaders headers = new HttpHeaders(); when(response.getHeaders()).thenReturn(headers); - headers.set(GoodData.GDC_REQUEST_ID_HEADER, "requestId"); + headers.set(Header.GDC_REQUEST_ID, "requestId"); headers.setContentType(MediaType.APPLICATION_JSON); when(response.getBody()).thenReturn(readFromResource(resourcePath)); return response; From 0ff4510adf029d7e081fc5d4b0a46d1f2125b95c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 15 Nov 2017 15:02:31 +0100 Subject: [PATCH 009/548] add TotalHeaderItem's constructor from Total --- .../gooddata/executeafm/response/TotalHeaderItem.java | 11 +++++++++++ .../executeafm/response/TotalHeaderItemTest.groovy | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java b/src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java index b02a626cb..271f1fc99 100644 --- a/src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java +++ b/src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java @@ -9,8 +9,11 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.md.report.Total; import com.gooddata.util.GoodDataToStringBuilder; +import static com.gooddata.util.Validate.notNull; + /** * Header of total */ @@ -29,6 +32,14 @@ public TotalHeaderItem(@JsonProperty("name") final String name) { this.name = name; } + /** + * Creates new header + * @param total total value + */ + public TotalHeaderItem(final Total total) { + this(notNull(total, "total").toString()); + } + /** * @return name of total */ diff --git a/src/test/groovy/com/gooddata/executeafm/response/TotalHeaderItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/response/TotalHeaderItemTest.groovy index 8c6f907c9..738f32444 100644 --- a/src/test/groovy/com/gooddata/executeafm/response/TotalHeaderItemTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/response/TotalHeaderItemTest.groovy @@ -5,6 +5,7 @@ */ package com.gooddata.executeafm.response +import com.gooddata.md.report.Total import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -18,7 +19,7 @@ class TotalHeaderItemTest extends Specification { def "should serialize"() { expect: - that new TotalHeaderItem('avg'), + that new TotalHeaderItem(Total.AVG), jsonEquals(resource(TOTAL_HEADER_ITEM_JSON)) } From f5edf092b1fae870d5f5b9cf02bb7c814415a2b6 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 30 Oct 2017 09:29:48 +0100 Subject: [PATCH 010/548] use dataList as execution result data Resolves #555 by introducing the interface Data and its three kinds - DataList, DataValue and NULL. --- .../com/gooddata/executeafm/result/Data.java | 106 ++++++++++++++++++ .../gooddata/executeafm/result/DataList.java | 75 +++++++++++++ .../gooddata/executeafm/result/DataValue.java | 74 ++++++++++++ .../executeafm/result/ExecutionResult.java | 16 ++- .../executeafm/result/DataListTest.groovy | 75 +++++++++++++ .../executeafm/result/DataTest.groovy | 25 +++++ .../executeafm/result/DataValueTest.groovy | 40 +++++++ .../result/ExecutionResultTest.groovy | 2 +- 8 files changed, 407 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/result/Data.java create mode 100644 src/main/java/com/gooddata/executeafm/result/DataList.java create mode 100644 src/main/java/com/gooddata/executeafm/result/DataValue.java create mode 100644 src/test/groovy/com/gooddata/executeafm/result/DataListTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/result/DataTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/result/DataValueTest.groovy diff --git a/src/main/java/com/gooddata/executeafm/result/Data.java b/src/main/java/com/gooddata/executeafm/result/Data.java new file mode 100644 index 000000000..edc8e821b --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/Data.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.List; +import java.util.Spliterator; +import java.util.stream.Collectors; + +import static java.util.Spliterators.spliteratorUnknownSize; +import static java.util.stream.StreamSupport.stream; + +/** + * Data of {@link ExecutionResult}, can be of three basic kinds - {@link #NULL}, list and simple value. + */ +@JsonDeserialize(using = Data.DataDeserializer.class) +public interface Data { + + Data NULL = new Data() { + @Override + public boolean isList() { + return false; + } + + @Override + public boolean isValue() { + return false; + } + + @Override + @JsonValue + public String textValue() { + return null; + } + }; + + /** + * @return true if this instance is of kind list, false otherwise + */ + boolean isList(); + + /** + * @return true if this instance is of kind value, false otherwise + */ + boolean isValue(); + + /** + * @return true if this instance is the same as {@link #NULL}, false otherwise + */ + default boolean isNull() { + return this == NULL; + } + + /** + * @return text data value, throws exception for data which can't be represented as text + */ + String textValue(); + + /** + * @return this instance cast to List, may throw exception if this instance is not of kind list. + */ + default List asList() { + throw new UnsupportedOperationException("This is not a list"); + } + + class DataDeserializer extends JsonDeserializer { + @Override + public Data deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException { + final JsonNode root = jp.readValueAsTree(); + if (root.isArray()) { + final List list = stream(spliteratorUnknownSize(root.elements(), Spliterator.ORDERED), false) + .map(elem -> { + try { + return ctxt.readValue(elem.traverse(jp.getCodec()), Data.class); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }).collect(Collectors.toList()); + return new DataList(list); + } else if (root.isTextual()) { + return new DataValue(root.textValue()); + } else if (root.isNull()) { + return NULL; + } else { + throw JsonMappingException.from(jp, "Unknown value of type: " + root.getNodeType()); + } + } + + @Override + public Data getNullValue(final DeserializationContext ctxt) throws JsonMappingException { + return NULL; + } + } +} diff --git a/src/main/java/com/gooddata/executeafm/result/DataList.java b/src/main/java/com/gooddata/executeafm/result/DataList.java new file mode 100644 index 000000000..762261ceb --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/DataList.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.gooddata.util.GoodDataToStringBuilder; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.gooddata.util.Validate.notNull; +import static java.util.stream.Collectors.toList; + +/** + * List value type of {@link Data}, basically wrapper for list of nested {@link Data} + */ +public class DataList extends ArrayList implements Data { + + /** + * Creates new instance of given list of data + * @param values list to use as values, can't be null + */ + public DataList(final List values) { + super(notNull(values, "values")); + } + + /** + * Creates new instance by transforming the given array to list of simple or null values + * @param array array of values + */ + DataList(final String[] array) { + this(Arrays.stream(array).map(DataList::simpleValue).collect(toList())); + } + + /** + * Creates new instance by transforming the given array to list of data lists of simple or null values + * @param array array of values + */ + DataList(final String[][] array) { + this(Arrays.stream(array).map(DataList::new).collect(toList())); + } + + private static Data simpleValue(final String value) { + return value == null ? Data.NULL : new DataValue(value); + } + + @Override + public boolean isList() { + return true; + } + + @Override + public boolean isValue() { + return false; + } + + @Override + public String textValue() { + throw new UnsupportedOperationException("DataList doesn't contain text value"); + } + + @Override + public List asList() { + return this; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + +} diff --git a/src/main/java/com/gooddata/executeafm/result/DataValue.java b/src/main/java/com/gooddata/executeafm/result/DataValue.java new file mode 100644 index 000000000..9093c8d43 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/DataValue.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.io.IOException; + +import static com.gooddata.util.Validate.notNull; + +/** + * Simple value type of {@link Data}. Wrapper of textual value. + */ +public class DataValue implements Data { + + private final String value; + + /** + * Creates new instance of given value. + * @param value textual value, can't be null + */ + public DataValue(final String value) { + this.value = notNull(value, "value"); + } + + @JsonValue + private String getValue() { + return value; + } + + @Override + public boolean isList() { + return false; + } + + @Override + public boolean isValue() { + return true; + } + + @Override + public String textValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DataValue dataValue = (DataValue) o; + + return value != null ? value.equals(dataValue.value) : dataValue.value == null; + } + + @Override + public int hashCode() { + return value != null ? value.hashCode() : 0; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } +} diff --git a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java index d6b37f49a..7c14052ce 100644 --- a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java +++ b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java @@ -30,10 +30,9 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class ExecutionResult { + private final DataList data; private final Paging paging; - @JsonProperty("data") - private List data; private List>> headerItems; private List>> totals; @@ -43,7 +42,7 @@ public class ExecutionResult { * @param paging result paging */ public ExecutionResult(final String[] data, final Paging paging) { - this.data = asList(notNull(data, "data")); + this.data = new DataList(notNull(data, "data")); this.paging = notNull(paging, "paging"); } @@ -53,7 +52,7 @@ public ExecutionResult(final String[] data, final Paging paging) { * @param paging result paging */ public ExecutionResult(final String[][] data, final Paging paging) { - this.data = stream(notNull(data, "data")).map(Arrays::asList).collect(toList()); + this.data = new DataList(notNull(data, "data")); this.paging = notNull(paging, "paging"); } @@ -65,7 +64,7 @@ public ExecutionResult(final String[][] data, final Paging paging) { * @param totals data of totals, for each total in each dimension, there is a list of total's values */ @JsonCreator - ExecutionResult(@JsonProperty("data") final List data, + ExecutionResult(@JsonProperty("data") final DataList data, @JsonProperty("paging") final Paging paging, @JsonProperty("headerItems") final List>> headerItems, @JsonProperty("totals") final List>> totals) { @@ -75,6 +74,13 @@ public ExecutionResult(final String[][] data, final Paging paging) { this.totals = totals; } + /** + * @return result data + */ + public DataList getData() { + return data; + } + /** * @return result paging */ diff --git a/src/test/groovy/com/gooddata/executeafm/result/DataListTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/DataListTest.groovy new file mode 100644 index 000000000..cc8df4040 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/DataListTest.groovy @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER + +class DataListTest extends Specification { + + def "should serialize simple"() { + expect: + OBJECT_MAPPER.writeValueAsString(new DataList([new DataValue('a'), new DataValue('b')])) == '["a","b"]' + } + + def "should serialize nested"() { + expect: + OBJECT_MAPPER.writeValueAsString(new DataList([ + new DataList([new DataValue('a'), new DataValue('b')]), + new DataList([new DataValue('c'), Data.NULL])])) == '[["a","b"],["c",null]]' + } + + def "should deserialize simple"() { + when: + DataList data = OBJECT_MAPPER.readValue('["a","b"]', DataList) + + then: + data.size() == 2 + data[0] == new DataValue('a') + data[1] == new DataValue('b') + data + } + + def "should deserialize nested"() { + when: + DataList data = OBJECT_MAPPER.readValue('[["a","b"],["c",null]]', DataList) + + then: + data.size() == 2 + + data[0] instanceof DataList + DataList row0 = data[0] as DataList + row0.size() == 2 + + data[1] instanceof DataList + DataList row1 = data[1] as DataList + row1.size() == 2 + + row0[0] == new DataValue('a') + row0[1] == new DataValue('b') + + row1[0] == new DataValue('c') + row1[1] == Data.NULL + } + + def "should behave as list"() { + when: + DataList data = new DataList([['a', 'b'], ['c', null]] as String[][]) + + then: + data.isList() + !data.isValue() + data[1][1] == Data.NULL + data.asList()[0] == new DataList(['a', 'b'] as String[]) + + when: + data.textValue() + + then: + thrown(UnsupportedOperationException) + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/DataTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/DataTest.groovy new file mode 100644 index 000000000..46b2ca072 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/DataTest.groovy @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import spock.lang.Specification + + +class DataTest extends Specification { + + def "should have correct null"() { + given: + Data data = Data.NULL + + expect: + !data.isList() + !data.isValue() + data.isNull() + data.textValue() == null + data + } + +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/DataValueTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/DataValueTest.groovy new file mode 100644 index 000000000..d5e2a5031 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/DataValueTest.groovy @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import nl.jqno.equalsverifier.EqualsVerifier +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER + +class DataValueTest extends Specification { + + def "should serialize"() { + expect: + OBJECT_MAPPER.writeValueAsString(new DataValue('123')) == '"123"' + } + + def "should deserialize"() { + expect: + OBJECT_MAPPER.readValue('"123"', DataValue) == new DataValue('123') + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(DataValue).usingGetClass().verify() + } + + def "should behave as value"() { + when: + DataValue data = new DataValue('123') + + then: + data.isValue() + !data.isList() + data.textValue() == '123' + data + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy index 97cedd2c0..4430135ff 100644 --- a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy @@ -38,7 +38,7 @@ class ExecutionResultTest extends Specification { def "should serialize full"() { expect: - that new ExecutionResult(DATA as List, + that new ExecutionResult(new DataList(DATA.collect{new DataValue(it)}), new Paging([4], [0], [4]), [[[ new AttributeHeaderItem('Cost of Goods Sold', '/gdc/md/FoodMartDemo/obj/124/elements?id=3200'), From fc58ea119b6a2767212599838358c57022ceb3b8 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 15 Nov 2017 16:41:47 +0100 Subject: [PATCH 011/548] [maven-release-plugin] prepare release gooddata-java-2.19.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index abc9f22a7..ec08a3989 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.18.3-SNAPSHOT + 2.19.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.19.0 From 23c42879390d549a789bb04656068210d831beb1 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 15 Nov 2017 16:41:47 +0100 Subject: [PATCH 012/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ec08a3989..f373df3e8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.19.0 + 2.19.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.19.0 + HEAD From c6fc641fcce319682e65fdaf03d7964f27bee051 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 15 Nov 2017 16:45:56 +0100 Subject: [PATCH 013/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0dc9d26d..edd4a6de3 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.18.2 + 2.19.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 20096f44ac4ddba85ec6132e316830f6ff1e2a0c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 20 Nov 2017 16:35:48 +0100 Subject: [PATCH 014/548] Introduce AttributeHeader.formOf The ExecutionResponse should inform client about which attribute does the header belongs to (not only display form) --- .../executeafm/response/AttributeHeader.java | 32 ++++++- .../response/AttributeInHeader.java | 84 +++++++++++++++++++ .../response/AttributeHeaderTest.groovy | 8 +- .../response/AttributeInHeaderTest.groovy | 41 +++++++++ .../response/ExecutionResponseTest.groovy | 6 +- .../response/ResultDimensionTest.groovy | 4 +- .../executeafm/response/attributeHeader.json | 7 +- .../response/attributeHeaderFull.json | 5 ++ .../response/attributeInHeader.json | 5 ++ .../response/executionResponse.json | 14 +++- .../executeafm/response/resultDimension.json | 7 +- 11 files changed, 200 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java create mode 100644 src/test/groovy/com/gooddata/executeafm/response/AttributeInHeaderTest.groovy create mode 100644 src/test/resources/executeafm/response/attributeInHeader.json diff --git a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java b/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java index d63771863..3acaf3f31 100644 --- a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java +++ b/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java @@ -29,21 +29,26 @@ public class AttributeHeader implements Header, LocallyIdentifiable { private final String localIdentifier; private final String uri; private final String identifier; + private final AttributeInHeader formOf; private List totalItems; /** * Creates new header + * @deprecated use the constructor with {@link AttributeInHeader} + * * @param name name * @param localIdentifier local identifier * @param uri uri * @param identifier identifier */ + @Deprecated public AttributeHeader(final String name, final String localIdentifier, final String uri, final String identifier) { - this.name = name; - this.localIdentifier = localIdentifier; - this.uri = uri; - this.identifier = identifier; + this.name = notEmpty(name, "name"); + this.localIdentifier = notEmpty(localIdentifier, "localIdentifier"); + this.uri = notEmpty(uri, "uri"); + this.identifier = notEmpty(identifier, "identifier"); + this.formOf = null; } /** @@ -52,6 +57,19 @@ public AttributeHeader(final String name, final String localIdentifier, final St * @param localIdentifier local identifier * @param uri uri * @param identifier identifier + * @param formOf info about attribute which this header's display form is form of + */ + public AttributeHeader(final String name, final String localIdentifier, final String uri, final String identifier, final AttributeInHeader formOf) { + this(name, localIdentifier, uri, identifier, formOf, null); + } + + /** + * Creates new header + * @param name name + * @param localIdentifier local identifier + * @param uri uri + * @param identifier identifier + * @param formOf info about attribute which this header's display form is form of * @param totalHeaderItems total header items */ @JsonCreator @@ -59,11 +77,13 @@ public AttributeHeader(@JsonProperty("name") final String name, @JsonProperty("localIdentifier") final String localIdentifier, @JsonProperty("uri") final String uri, @JsonProperty("identifier") final String identifier, + @JsonProperty("formOf") final AttributeInHeader formOf, @JsonProperty("totalItems") final List totalHeaderItems) { this.name = notEmpty(name, "name"); this.localIdentifier = notEmpty(localIdentifier, "localIdentifier"); this.uri = notEmpty(uri, "uri"); this.identifier = notEmpty(identifier, "identifier"); + this.formOf = notNull(formOf, "formOf"); this.totalItems = totalHeaderItems; } @@ -101,6 +121,10 @@ public String getIdentifier() { return identifier; } + public AttributeInHeader getFormOf() { + return formOf; + } + /** * Totals' headers belonging to the same level as this header. * @return lists of totals' header diff --git a/src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java b/src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java new file mode 100644 index 000000000..49f800807 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.response; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; + +import static com.gooddata.util.Validate.notEmpty; + +/** + * Represents attribute in {@link AttributeHeader} + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AttributeInHeader { + private final String name; + private final String uri; + private final String identifier; + + /** + * Creates new instance + * @param name attribute's title + * @param uri attribute's uri + * @param identifier attribute's identifier + */ + @JsonCreator + public AttributeInHeader(@JsonProperty("name") final String name, + @JsonProperty("uri") final String uri, + @JsonProperty("identifier") final String identifier) { + this.name = notEmpty(name, "name"); + this.uri = notEmpty(uri, "uri"); + this.identifier = notEmpty(identifier, "identifier"); + } + + /** + * @return attribute's title + */ + public String getName() { + return name; + } + + /** + * @return attribute's uri + */ + public String getUri() { + return uri; + } + + /** + * @return attribute's identifier + */ + public String getIdentifier() { + return identifier; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + AttributeInHeader attributeInHeader = (AttributeInHeader) o; + + if (name != null ? !name.equals(attributeInHeader.name) : attributeInHeader.name != null) return false; + if (uri != null ? !uri.equals(attributeInHeader.uri) : attributeInHeader.uri != null) return false; + return identifier != null ? identifier.equals(attributeInHeader.identifier) : attributeInHeader.identifier == null; + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (uri != null ? uri.hashCode() : 0); + result = 31 * result + (identifier != null ? identifier.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/response/AttributeHeaderTest.groovy b/src/test/groovy/com/gooddata/executeafm/response/AttributeHeaderTest.groovy index 939f5434a..42510b4b2 100644 --- a/src/test/groovy/com/gooddata/executeafm/response/AttributeHeaderTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/response/AttributeHeaderTest.groovy @@ -17,15 +17,17 @@ class AttributeHeaderTest extends Specification { private static final String ATTRIBUTE_HEADER_JSON = 'executeafm/response/attributeHeader.json' private static final String ATTRIBUTE_HEADER_FULL_JSON = 'executeafm/response/attributeHeaderFull.json' + private static final AttributeInHeader FORM_OF = new AttributeInHeader('Some attr', '/gdc/md/project_id/obj/567', 'attr.some.id') + def "should serialize full"() { expect: - that new AttributeHeader('Name', 'a1', '/gdc/md/project_id/obj/123', 'attr.dataset.name', [new TotalHeaderItem('sum')]), + that new AttributeHeader('Name', 'a1', '/gdc/md/project_id/obj/123', 'attr.dataset.name', FORM_OF, [new TotalHeaderItem('sum')]), jsonEquals(resource(ATTRIBUTE_HEADER_FULL_JSON)) } def "should serialize"() { expect: - that new AttributeHeader('Name', 'a1', '/gdc/md/project_id/obj/123', 'attr.dataset.name'), + that new AttributeHeader('Name', 'a1', '/gdc/md/project_id/obj/123', 'attr.dataset.name', FORM_OF), jsonEquals(resource(ATTRIBUTE_HEADER_JSON)) } @@ -38,6 +40,7 @@ class AttributeHeaderTest extends Specification { header.localIdentifier == 'a1' header.uri == '/gdc/md/project_id/obj/123' header.identifier == 'attr.dataset.name' + header.formOf == FORM_OF } def "should deserialize full"() { @@ -49,6 +52,7 @@ class AttributeHeaderTest extends Specification { header.localIdentifier == 'a1' header.uri == '/gdc/md/project_id/obj/123' header.identifier == 'attr.dataset.name' + header.formOf == FORM_OF header.totalItems.size() == 1 header.totalItems.first().name == 'sum' header.toString() diff --git a/src/test/groovy/com/gooddata/executeafm/response/AttributeInHeaderTest.groovy b/src/test/groovy/com/gooddata/executeafm/response/AttributeInHeaderTest.groovy new file mode 100644 index 000000000..68fdf55b6 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/response/AttributeInHeaderTest.groovy @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.response + +import nl.jqno.equalsverifier.EqualsVerifier +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class AttributeInHeaderTest extends Specification { + + private static final String ATTRIBUTE_IN_HEADER_JSON = 'executeafm/response/attributeInHeader.json' + + def "should serialize"() { + expect: + that new AttributeInHeader('Some attr', '/gdc/md/project_id/obj/567', 'attr.some.id'), + jsonEquals(resource(ATTRIBUTE_IN_HEADER_JSON)) + } + + def "should deserialize"() { + when: + AttributeInHeader attributeInHeader = readObjectFromResource("/$ATTRIBUTE_IN_HEADER_JSON", AttributeInHeader) + + then: + attributeInHeader.name == 'Some attr' + attributeInHeader.uri == '/gdc/md/project_id/obj/567' + attributeInHeader.identifier == 'attr.some.id' + attributeInHeader.toString() + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(AttributeInHeader).usingGetClass().verify() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/response/ExecutionResponseTest.groovy b/src/test/groovy/com/gooddata/executeafm/response/ExecutionResponseTest.groovy index 39d956827..2f4e0b790 100644 --- a/src/test/groovy/com/gooddata/executeafm/response/ExecutionResponseTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/response/ExecutionResponseTest.groovy @@ -16,13 +16,15 @@ class ExecutionResponseTest extends Specification { private static final String EXECUTION_RESPONSE_JSON = 'executeafm/response/executionResponse.json' + private static final AttributeInHeader FORM_OF = new AttributeInHeader('Some attr', '/gdc/md/project_id/obj/567', 'attr.some.id') + def "should serialize"() { expect: that new ExecutionResponse( [ new ResultDimension( - new AttributeHeader('Account', 'account', '/gdc/md/FoodMartDemo/obj/124', 'attr.account'), - new AttributeHeader('Account Type', 'accountType', '/gdc/md/FoodMartDemo/obj/113', 'attr.accountType'), + new AttributeHeader('Account', 'account', '/gdc/md/FoodMartDemo/obj/124', 'attr.account', FORM_OF), + new AttributeHeader('Account Type', 'accountType', '/gdc/md/FoodMartDemo/obj/113', 'attr.accountType', FORM_OF), new MeasureGroupHeader([ new MeasureHeaderItem('Accounting Amount [Sum]', 'format1', 'sum', '/gdc/md/FoodMartDemo/obj/114', 'metric.sum'), new MeasureHeaderItem('Accounting Amount [Avg]', 'format2', 'avg', '/gdc/md/FoodMartDemo/obj/115', 'metric.avg') diff --git a/src/test/groovy/com/gooddata/executeafm/response/ResultDimensionTest.groovy b/src/test/groovy/com/gooddata/executeafm/response/ResultDimensionTest.groovy index 39ed661a3..fd3235d75 100644 --- a/src/test/groovy/com/gooddata/executeafm/response/ResultDimensionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/response/ResultDimensionTest.groovy @@ -17,10 +17,12 @@ class ResultDimensionTest extends Specification { private static final String RESULT_DIMENSION_JSON = 'executeafm/response/resultDimension.json' + private static final AttributeInHeader FORM_OF = new AttributeInHeader('Some attr', '/gdc/md/project_id/obj/567', 'attr.some.id') + def "should serialize"() { expect: that new ResultDimension( - new AttributeHeader('Name', 'a1', '/gdc/md/project_id/obj/123', 'attr.dataset.name'), + new AttributeHeader('Name', 'a1', '/gdc/md/project_id/obj/123', 'attr.dataset.name', FORM_OF), new MeasureGroupHeader([new MeasureHeaderItem('Name', '#,##0.00', 'm1')])), jsonEquals(resource(RESULT_DIMENSION_JSON)) } diff --git a/src/test/resources/executeafm/response/attributeHeader.json b/src/test/resources/executeafm/response/attributeHeader.json index 06abcd65d..4f8a533d2 100644 --- a/src/test/resources/executeafm/response/attributeHeader.json +++ b/src/test/resources/executeafm/response/attributeHeader.json @@ -3,6 +3,11 @@ "name": "Name", "localIdentifier": "a1", "uri": "/gdc/md/project_id/obj/123", - "identifier": "attr.dataset.name" + "identifier": "attr.dataset.name", + "formOf": { + "name": "Some attr", + "uri": "/gdc/md/project_id/obj/567", + "identifier": "attr.some.id" + } } } \ No newline at end of file diff --git a/src/test/resources/executeafm/response/attributeHeaderFull.json b/src/test/resources/executeafm/response/attributeHeaderFull.json index 89e16b5df..4d54ffb5b 100644 --- a/src/test/resources/executeafm/response/attributeHeaderFull.json +++ b/src/test/resources/executeafm/response/attributeHeaderFull.json @@ -4,6 +4,11 @@ "localIdentifier": "a1", "uri": "/gdc/md/project_id/obj/123", "identifier": "attr.dataset.name", + "formOf": { + "name": "Some attr", + "uri": "/gdc/md/project_id/obj/567", + "identifier": "attr.some.id" + }, "totalItems": [ { "totalHeaderItem": { diff --git a/src/test/resources/executeafm/response/attributeInHeader.json b/src/test/resources/executeafm/response/attributeInHeader.json new file mode 100644 index 000000000..179110d89 --- /dev/null +++ b/src/test/resources/executeafm/response/attributeInHeader.json @@ -0,0 +1,5 @@ +{ + "name": "Some attr", + "uri": "/gdc/md/project_id/obj/567", + "identifier": "attr.some.id" +} \ No newline at end of file diff --git a/src/test/resources/executeafm/response/executionResponse.json b/src/test/resources/executeafm/response/executionResponse.json index df35ce63e..9fe4a468a 100644 --- a/src/test/resources/executeafm/response/executionResponse.json +++ b/src/test/resources/executeafm/response/executionResponse.json @@ -11,7 +11,12 @@ "uri": "/gdc/md/FoodMartDemo/obj/124", "identifier": "attr.account", "name": "Account", - "localIdentifier": "account" + "localIdentifier": "account", + "formOf": { + "name": "Some attr", + "uri": "/gdc/md/project_id/obj/567", + "identifier": "attr.some.id" + } } }, { @@ -19,7 +24,12 @@ "uri": "/gdc/md/FoodMartDemo/obj/113", "identifier": "attr.accountType", "name": "Account Type", - "localIdentifier": "accountType" + "localIdentifier": "accountType", + "formOf": { + "name": "Some attr", + "uri": "/gdc/md/project_id/obj/567", + "identifier": "attr.some.id" + } } }, { diff --git a/src/test/resources/executeafm/response/resultDimension.json b/src/test/resources/executeafm/response/resultDimension.json index 4352d0831..05212fe20 100644 --- a/src/test/resources/executeafm/response/resultDimension.json +++ b/src/test/resources/executeafm/response/resultDimension.json @@ -5,7 +5,12 @@ "name": "Name", "localIdentifier": "a1", "uri": "/gdc/md/project_id/obj/123", - "identifier": "attr.dataset.name" + "identifier": "attr.dataset.name", + "formOf": { + "name": "Some attr", + "uri": "/gdc/md/project_id/obj/567", + "identifier": "attr.some.id" + } } }, { From d0e51ac41621884fa3603262c55d3e9dc7dca458 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 21 Nov 2017 08:26:06 +0100 Subject: [PATCH 015/548] Introduce support for ExecutionResult's warnings Resolves #560 --- .../executeafm/result/ExecutionResult.java | 29 ++++-- .../gooddata/executeafm/result/Warning.java | 95 +++++++++++++++++++ .../result/ExecutionResultTest.groovy | 9 +- .../executeafm/result/WarningTest.groovy | 42 ++++++++ .../result/executionResultFull.json | 7 ++ .../resources/executeafm/result/warning.json | 5 + 6 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/result/Warning.java create mode 100644 src/test/groovy/com/gooddata/executeafm/result/WarningTest.groovy create mode 100644 src/test/resources/executeafm/result/warning.json diff --git a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java index 7c14052ce..3d133aba4 100644 --- a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java +++ b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java @@ -13,14 +13,9 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static com.gooddata.util.Validate.notNull; -import static java.util.Arrays.asList; -import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toList; -import static org.apache.commons.lang3.ArrayUtils.toObject; /** * Data result of the {@link com.gooddata.executeafm.Execution}. @@ -35,6 +30,7 @@ public class ExecutionResult { private List>> headerItems; private List>> totals; + private List warnings; /** * Creates new result @@ -65,13 +61,15 @@ public ExecutionResult(final String[][] data, final Paging paging) { */ @JsonCreator ExecutionResult(@JsonProperty("data") final DataList data, - @JsonProperty("paging") final Paging paging, - @JsonProperty("headerItems") final List>> headerItems, - @JsonProperty("totals") final List>> totals) { + @JsonProperty("paging") final Paging paging, + @JsonProperty("headerItems") final List>> headerItems, + @JsonProperty("totals") final List>> totals, + @JsonProperty("warnings") final List warnings) { this.data = data; this.paging = paging; this.headerItems = headerItems; this.totals = totals; + this.warnings = warnings; } /** @@ -129,6 +127,21 @@ public void setTotals(final List>> totals) { this.totals = totals; } + /** + * @return result's warnings + */ + public List getWarnings() { + return warnings; + } + + /** + * Sets warnings for this result + * @param warnings result's warning + */ + public void setWarnings(final List warnings) { + this.warnings = warnings; + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/main/java/com/gooddata/executeafm/result/Warning.java b/src/main/java/com/gooddata/executeafm/result/Warning.java new file mode 100644 index 000000000..845bc4eb4 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/result/Warning.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.util.List; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; +import static java.util.Collections.emptyList; + +/** + * {@link ExecutionResult}'s warning. + */ +public class Warning { + private final String warningCode; + private final String message; + private final List parameters; + + /** + * Creates new instance + * @param warningCode error code + * @param message message + */ + public Warning(final String warningCode, final String message) { + this(warningCode, message, emptyList()); + } + + /** + * Creates new instance + * @param warningCode error code + * @param message message + * @param parameters message's parameters + */ + @JsonCreator + public Warning(@JsonProperty("warningCode") final String warningCode, + @JsonProperty("message") final String message, + @JsonProperty("parameters") final List parameters) { + this.warningCode = notEmpty(warningCode, "warningCode"); + this.message = notEmpty(message, "message"); + this.parameters = notNull(parameters, "parameters"); + } + + /** + * @return warning's error code + */ + public String getWarningCode() { + return warningCode; + } + + /** + * @return warning's message + */ + public String getMessage() { + return message; + } + + /** + * @return message's parameters + */ + public List getParameters() { + return parameters; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Warning warning = (Warning) o; + + if (warningCode != null ? !warningCode.equals(warning.warningCode) : warning.warningCode != null) return false; + if (message != null ? !message.equals(warning.message) : warning.message != null) return false; + return parameters != null ? parameters.equals(warning.parameters) : warning.parameters == null; + } + + @Override + public int hashCode() { + int result = warningCode != null ? warningCode.hashCode() : 0; + result = 31 * result + (message != null ? message.hashCode() : 0); + result = 31 * result + (parameters != null ? parameters.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy index 4430135ff..56087edb8 100644 --- a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy @@ -43,7 +43,8 @@ class ExecutionResultTest extends Specification { [[[ new AttributeHeaderItem('Cost of Goods Sold', '/gdc/md/FoodMartDemo/obj/124/elements?id=3200'), new AttributeHeaderItem('Salaries', '/gdc/md/FoodMartDemo/obj/124/elements?id=6000')]]], - [[['25']]]), + [[['25']]], + [new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null])]), jsonEquals(resource(EXECUTION_RESULT_FULL_JSON)) } @@ -65,6 +66,9 @@ class ExecutionResultTest extends Specification { def totals = result.totals totals[0][0][0] == '25' + def warnings = result.warnings + warnings == [new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null])] + result.toString() } @@ -73,11 +77,14 @@ class ExecutionResultTest extends Specification { ExecutionResult result = new ExecutionResult([1] as String[], new Paging()) result.addHeaderItems([[new AttributeHeaderItem("n", "u")]]) result.setTotals([[[1]]]) + result.setWarnings([new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null])]) then: result.getHeaderItems()[0][0][0].name == "n" result.getHeaderItems()[0][0][0].uri == "u" result.getTotals() == [[[1]]] + + result.getWarnings() == [new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null])] } } diff --git a/src/test/groovy/com/gooddata/executeafm/result/WarningTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/WarningTest.groovy new file mode 100644 index 000000000..2dfa14e68 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/result/WarningTest.groovy @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.result + +import nl.jqno.equalsverifier.EqualsVerifier +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + + +class WarningTest extends Specification { + + private static final String WARNING_JSON = 'executeafm/result/warning.json' + + def "should serialize"() { + expect: + that new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null]), + jsonEquals(resource(WARNING_JSON)) + } + + def "should deserialize"() { + when: + Warning warning = readObjectFromResource("/$WARNING_JSON", Warning) + + then: + warning.warningCode == 'gdc123' + warning.message == 'Some msg %s %s %s' + warning.parameters == ['bum', 1, null] + warning.toString() + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(Warning).usingGetClass().verify() + } +} diff --git a/src/test/resources/executeafm/result/executionResultFull.json b/src/test/resources/executeafm/result/executionResultFull.json index 07eb48cc0..119195f8f 100644 --- a/src/test/resources/executeafm/result/executionResultFull.json +++ b/src/test/resources/executeafm/result/executionResultFull.json @@ -41,6 +41,13 @@ "25" ] ] + ], + "warnings": [ + { + "warningCode": "gdc123", + "message": "Some msg %s %s %s", + "parameters": ["bum", 1, null] + } ] } } diff --git a/src/test/resources/executeafm/result/warning.json b/src/test/resources/executeafm/result/warning.json new file mode 100644 index 000000000..b417f7915 --- /dev/null +++ b/src/test/resources/executeafm/result/warning.json @@ -0,0 +1,5 @@ +{ + "warningCode": "gdc123", + "message": "Some msg %s %s %s", + "parameters": ["bum", 1, null] +} \ No newline at end of file From 5db6e7b745bc338d6079a20887262957ca0fcdb1 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 21 Nov 2017 14:41:28 +0100 Subject: [PATCH 016/548] fix: add forgotten backward compatible constructor to AttributeHeader --- .../executeafm/response/AttributeHeader.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java b/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java index 3acaf3f31..6e665134f 100644 --- a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java +++ b/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java @@ -51,6 +51,30 @@ public AttributeHeader(final String name, final String localIdentifier, final St this.formOf = null; } + /** + * Creates new header + * @deprecated use the constructor with {@link AttributeInHeader} + * + * @param name name + * @param localIdentifier local identifier + * @param uri uri + * @param identifier identifier + * @param totalHeaderItems total header items + */ + @Deprecated + public AttributeHeader(final String name, + final String localIdentifier, + final String uri, + final String identifier, + final List totalHeaderItems) { + this.name = notEmpty(name, "name"); + this.localIdentifier = notEmpty(localIdentifier, "localIdentifier"); + this.uri = notEmpty(uri, "uri"); + this.identifier = notEmpty(identifier, "identifier"); + this.formOf = null; + this.totalItems = totalHeaderItems; + } + /** * Creates new header * @param name name From c7a0d788966942128857b749a256517e0a06bd95 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 21 Nov 2017 15:08:40 +0100 Subject: [PATCH 017/548] [maven-release-plugin] prepare release gooddata-java-2.20.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f373df3e8..f138b7558 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.19.1-SNAPSHOT + 2.20.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.20.0 From 67c1b95579280c14df9d0c90145ce24826c96683 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 21 Nov 2017 15:08:41 +0100 Subject: [PATCH 018/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f138b7558..4fa061670 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.20.0 + 2.20.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.20.0 + HEAD From ec905c37de560de6313376acb788397d731cba68 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 21 Nov 2017 15:19:43 +0100 Subject: [PATCH 019/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index edd4a6de3..b46be890d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.19.0 + 2.20.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 83487bbf6f6856d983d08f7f5aaa968caeec03ac Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 12:48:57 +0100 Subject: [PATCH 020/548] allow ResultHeaderItem to have empty name --- .../executeafm/result/ResultHeaderItem.java | 4 ++-- .../executeafm/result/ResultHeaderItemTest.groovy | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java b/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java index dea5c5423..bd0e727fb 100644 --- a/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java +++ b/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.gooddata.util.GoodDataToStringBuilder; -import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; /** * Represent header items available in {@link ExecutionResult} @@ -25,7 +25,7 @@ public abstract class ResultHeaderItem { private final String name; protected ResultHeaderItem(final String name) { - this.name = notEmpty(name, "name"); + this.name = notNull(name, "name"); } /** diff --git a/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy index 89f28e315..37f61502c 100644 --- a/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/result/ResultHeaderItemTest.groovy @@ -25,4 +25,17 @@ class ResultHeaderItemTest extends Specification { typeClass << [AttributeHeaderItem, ResultMeasureHeaderItem, ResultTotalHeaderItem] type = typeClass.simpleName.uncapitalize() } + + def "should allow empty name"() { + expect: + new ResultHeaderItem('') {}.name == '' + } + + def "should not allow null name"() { + when: + new ResultHeaderItem(null) {} + + then: + thrown(IllegalArgumentException) + } } From 1cd99db9fd5e2ac84ea20744c3e8b17510b84028 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 12:56:29 +0100 Subject: [PATCH 021/548] allow construct ResultTotalHeaderItem from total type only --- .../executeafm/result/ResultTotalHeaderItem.java | 16 ++++++++++++++++ .../result/ResultTotalHeaderItemTest.groovy | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java b/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java index a6bfdf66c..40eaa7ba4 100644 --- a/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java +++ b/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java @@ -24,6 +24,22 @@ public class ResultTotalHeaderItem extends ResultHeaderItem { private final String type; + /** + * Creates new instance of given total type, type is used for the name as well + * @param type total type + */ + public ResultTotalHeaderItem(final String type) { + this(type, type); + } + + /** + * Creates new instance of given total type, type is used for the name as well + * @param type total type + */ + public ResultTotalHeaderItem(final Total type) { + this(notNull(type, "type").toString()); + } + /** * Creates new instance of given header name and total type * @param name header name diff --git a/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy index c4fd7d53b..fd3c12d6c 100644 --- a/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/result/ResultTotalHeaderItemTest.groovy @@ -32,4 +32,16 @@ class ResultTotalHeaderItemTest extends Specification { item.name == 'Some total' item.type == 'avg' } + + def "should create from type only"() { + expect: + with(new ResultTotalHeaderItem('avg')) { + name == 'avg' + type == 'avg' + } + with(new ResultTotalHeaderItem(Total.SUM)) { + name == 'sum' + type == 'sum' + } + } } From efa4594a0f810bb4f6920324558cc52abeefcae1 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 13:54:15 +0100 Subject: [PATCH 022/548] improve SimpleMeasureDefinition javadoc --- .../afm/SimpleMeasureDefinition.java | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java index 7722536dd..5d1e17415 100644 --- a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java @@ -40,9 +40,9 @@ public SimpleMeasureDefinition(final ObjQualifier item) { /** * Creates new definition - * @param item item which is measured + * @param item item which is measured, can be attribute, fact or another measure * @param aggregation additional aggregation applied - * @param computeRatio whether should be shown in percent + * @param computeRatio whether should be shown as ratio * @param filters additional filters applied */ @JsonCreator @@ -56,11 +56,25 @@ public SimpleMeasureDefinition(@JsonProperty("item") final ObjQualifier item, this.filters = filters; } + /** + * Creates new definition + * @param item item which is measured, can be attribute, fact or another measure + * @param aggregation additional aggregation applied + * @param computeRatio whether should be shown as ratio + * @param filters additional filters applied + */ public SimpleMeasureDefinition(final ObjQualifier item, final Aggregation aggregation, final Boolean computeRatio, final List filters) { this(item, notNull(aggregation, "aggregation").toString(), computeRatio, filters); } + /** + * Creates new definition + * @param item item which is measured, can be attribute, fact or another measure + * @param aggregation additional aggregation applied + * @param computeRatio whether should be shown as ratio + * @param filters additional filters applied + */ public SimpleMeasureDefinition(final ObjQualifier item, final Aggregation aggregation, final Boolean computeRatio, final FilterItem... filters) { this(item, aggregation, computeRatio, asList(filters)); @@ -81,43 +95,75 @@ public String getUri() { return getItem().getUri(); } - public ObjQualifier getItem() { - return item; - } - @Override public ObjQualifier getObjQualifier() { return getItem(); } + /** + * @return measured item, can be attribute, fact or another measure + */ + public ObjQualifier getItem() { + return item; + } + + /** + * @return additional aggregation applied + */ public String getAggregation() { return aggregation; } + /** + * Set additional aggregation applied + * @param aggregation additional aggregation applied + */ public void setAggregation(final String aggregation) { this.aggregation = aggregation; } + /** + * Set additional aggregation applied + * @param aggregation additional aggregation applied + */ public void setAggregation(final Aggregation aggregation) { setAggregation(notNull(aggregation, "aggregation").toString()); } + /** + * @return true when should be shown as ratio, false otherwise + */ public Boolean getComputeRatio() { return computeRatio; } + /** + * Set whether should be shown as ratio + * @param computeRatio whether should be shown as ratio + */ public void setComputeRatio(final Boolean computeRatio) { this.computeRatio = computeRatio; } + /** + * @return additional filters applied + */ public List getFilters() { return filters; } + /** + * Set additional filters applied + * @param filters additional filters applied + */ public void setFilters(final List filters) { this.filters = filters; } + /** + * Apply additional filter + * @param filter filter to be applied + */ public void addFilter(final FilterItem filter) { if (filters == null) { filters = new ArrayList<>(); @@ -125,14 +171,23 @@ public void addFilter(final FilterItem filter) { filters.add(notNull(filter, "filter")); } + /** + * @return true when filters are set, false otherwise + */ public boolean hasFilters() { return filters != null && !filters.isEmpty(); } + /** + * @return true when computeRatio is set, false otherwise + */ public boolean hasComputeRatio() { return computeRatio != null && computeRatio; } + /** + * @return true when additional aggregation is set, false otherwise + */ public boolean hasAggregation() { return aggregation != null; } From 723e2c324907ffefdd29937cbdcdc01bb382afc3 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 14:29:17 +0100 Subject: [PATCH 023/548] [maven-release-plugin] prepare release gooddata-java-2.20.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4fa061670..bdd8571a6 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.20.1-SNAPSHOT + 2.20.1 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.20.1 From e0e85531115806ecd151fb3efe71eb0dbc6f1ed1 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 14:29:17 +0100 Subject: [PATCH 024/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bdd8571a6..db217bebe 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.20.1 + 2.20.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.20.1 + HEAD From 7f59978617d9af4867f48ef4bdccfe6e817daf1f Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 14:51:13 +0100 Subject: [PATCH 025/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b46be890d..5b59c921b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.20.0 + 2.21.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From ab4e35d2c786998e2a19f25dcd32233b2bea94e8 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 15:00:26 +0100 Subject: [PATCH 026/548] bump version (fixed) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b59c921b..3d572a6aa 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.21.0 + 2.20.1 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From bc11ec113d10cd1eaf9de84f4816b602b659e68d Mon Sep 17 00:00:00 2001 From: Jan Pradac Date: Mon, 27 Nov 2017 16:18:31 +0100 Subject: [PATCH 027/548] Add 'aggregation' to AttributeSortItem - we need it to support 'area' (or total) sort without total being defined --- .../resultspec/AttributeSortAggregation.java | 24 +++++++++ .../resultspec/AttributeSortItem.java | 53 +++++++++++++++++-- .../resultspec/AttributeSortItemTest.groovy | 11 +++- .../attributeSortItemWithAggregation.json | 7 +++ 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java create mode 100644 src/test/resources/executeafm/resultspec/attributeSortItemWithAggregation.json diff --git a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java b/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java new file mode 100644 index 000000000..e239c43ec --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.executeafm.resultspec; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Represents aggregation used when putting together all related + * values belonging to attribute element when we are sorting by this + * attribute. You can find more details in {@link AttributeSortItem}. + */ +public enum AttributeSortAggregation { + SUM; + + @JsonValue + @Override + public String toString() { + return name().toLowerCase(); + } +} diff --git a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java b/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java index 0e2b5e6d8..efd78ce32 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java +++ b/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java @@ -6,6 +6,7 @@ package com.gooddata.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; @@ -17,24 +18,66 @@ /** * Define sort by specific attribute + * + *

With "aggregation" active you can sort all elements of attribute + * by "aggregation fn" applied to all valid values belonging to each + * element. This is extremely useful when sorting stacked + * visualizations like stack bar/area charts. Currently supported is + * only "sum", see {@link AttributeSortAggregation}

+ * + *

Simple example (dimension = Year, measureGroup; 2 metrics; sort + * on Year with aggregation="sum", descending):

+ *
+ * Year       2006        2007
+ * Names     M1  M2      M1   M2
+ * Values    1    2       3    4
+ * 
+ * + *

We take all values belonging to each attribute element of chosen attribute + * and apply selected function (sum) on them. Notice that we are summarising + * values from different metrics:

+ *
+ * 2006 (1 + 2 = 3)
+ * 2007 (3 + 4 = 7)
+ * 
+ * + *

After that we shuffle year attribute elements related to results from "sum" + * function:

+ *
+ * Year       2007        2006
+ * Names     M1  M2      M1   M2
+ * Values    3    4       1    2
+ * 
*/ @JsonTypeInfo(include = As.WRAPPER_OBJECT, use = Id.NAME) @JsonTypeName("attributeSortItem") +@JsonInclude(JsonInclude.Include.NON_NULL) public class AttributeSortItem implements SortItem { private final String direction; - private final String attributeIdentifier; + private final String aggregation; @JsonCreator public AttributeSortItem(@JsonProperty("direction") final String direction, - @JsonProperty("attributeIdentifier") final String attributeIdentifier) { + @JsonProperty("attributeIdentifier") final String attributeIdentifier, + @JsonProperty("aggregation") final String aggregation) { this.attributeIdentifier = attributeIdentifier; this.direction = direction; + this.aggregation = aggregation; + } + + public AttributeSortItem(final String direction, + final String attributeIdentifier) { + this(direction, attributeIdentifier, null); } public AttributeSortItem(final Direction direction, final String attributeIdentifier) { - this(notNull(direction, "direction").toString(), attributeIdentifier); + this(notNull(direction, "direction").toString(), attributeIdentifier, null); + } + + public AttributeSortItem(final Direction direction, final String attributeIdentifier, final AttributeSortAggregation aggregation) { + this(notNull(direction, "direction").toString(), attributeIdentifier, notNull(aggregation, "aggregation").toString()); } public String getDirection() { @@ -45,6 +88,10 @@ public String getAttributeIdentifier() { return attributeIdentifier; } + public String getAggregation() { + return aggregation; + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/test/groovy/com/gooddata/executeafm/resultspec/AttributeSortItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/resultspec/AttributeSortItemTest.groovy index 190c18fd8..b9828e50f 100644 --- a/src/test/groovy/com/gooddata/executeafm/resultspec/AttributeSortItemTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/resultspec/AttributeSortItemTest.groovy @@ -15,6 +15,8 @@ import static spock.util.matcher.HamcrestSupport.that class AttributeSortItemTest extends Specification { private static final String ATTRIBUTE_SORT_ITEM_JSON = 'executeafm/resultspec/attributeSortItem.json' + private static final String ATTRIBUTE_SORT_ITEM_WITH_AGGREGATION_JSON = 'executeafm/resultspec/attributeSortItemWithAggregation.json' + def "should serialize values"() { expect: @@ -22,13 +24,20 @@ class AttributeSortItemTest extends Specification { jsonEquals(resource(ATTRIBUTE_SORT_ITEM_JSON)) } + def "should serialize values with aggregation"() { + expect: + that new AttributeSortItem(Direction.ASC, 'aId', AttributeSortAggregation.SUM), + jsonEquals(resource(ATTRIBUTE_SORT_ITEM_WITH_AGGREGATION_JSON)) + } + def "should deserialize values"() { when: - AttributeSortItem item = readObjectFromResource("/$ATTRIBUTE_SORT_ITEM_JSON", AttributeSortItem) + AttributeSortItem item = readObjectFromResource("/$ATTRIBUTE_SORT_ITEM_WITH_AGGREGATION_JSON", AttributeSortItem) then: item.attributeIdentifier == 'aId' item.direction == 'asc' + item.aggregation == 'sum' item.toString() } } diff --git a/src/test/resources/executeafm/resultspec/attributeSortItemWithAggregation.json b/src/test/resources/executeafm/resultspec/attributeSortItemWithAggregation.json new file mode 100644 index 000000000..a51f79dbd --- /dev/null +++ b/src/test/resources/executeafm/resultspec/attributeSortItemWithAggregation.json @@ -0,0 +1,7 @@ +{ + "attributeSortItem": { + "attributeIdentifier": "aId", + "direction": "asc", + "aggregation": "sum" + } +} From 66d235a9f8aabc587af3f98fcc5720fa821e9f8b Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 28 Nov 2017 08:24:26 +0100 Subject: [PATCH 028/548] [maven-release-plugin] prepare release gooddata-java-2.20.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index db217bebe..68d04ac3d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.20.2-SNAPSHOT + 2.20.2 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.20.2 From 1ab11aaeae581eae0d5250557d47ae4330af508c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 28 Nov 2017 08:24:26 +0100 Subject: [PATCH 029/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 68d04ac3d..438783949 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.20.2 + 2.20.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.20.2 + HEAD From 53e7b345fbc172ad80c57a7e00f383f16e7a2d77 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 28 Nov 2017 08:27:41 +0100 Subject: [PATCH 030/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d572a6aa..b1152f432 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.20.1 + 2.20.2 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 8701ffeac82af3a1782927232bc2ac680c080fc3 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 23 Nov 2017 15:24:42 +0100 Subject: [PATCH 031/548] introduce release script --- release.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 release.sh diff --git a/release.sh b/release.sh new file mode 100755 index 000000000..d7c0be7d9 --- /dev/null +++ b/release.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +usage(){ + echo "Usage: $0 -v -g " + exit 1 +} + +while getopts ":hv:g:" opt +do + case ${opt} in + v) + version=${OPTARG} + ;; + g) + gpg_pass=${OPTARG} + ;; + h) + usage + exit 0 + ;; + + \?) + echo -e "Invalid option: -${OPTARG}" + exit 1 + ;; + + :) + echo -e "Option -${OPTARG} require argument." + exit 2 + ;; + esac +done + +shift $(( ${OPTIND} - 1 )) + +if [ $# -ne 0 ] +then + echo "There are unexpected parameters!" 1>&2 + usage + exit 1 +fi + +if [ -z "${version}" ] +then + echo "No version given!" + usage + exit 1 +fi + +if [ -z "${gpg_pass}" ] +then + echo "No gpg password given!" + usage + exit 1 +fi + +mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" +sed -i "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md +git commit -a -m "bump version" +git push origin --tags HEAD From f68f8ffd3504968885250af74f799310cc255619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Wed, 6 Dec 2017 11:25:11 +0100 Subject: [PATCH 032/548] introduce ExecuteAfmService --- pom.xml | 18 +++ src/main/java/com/gooddata/GoodData.java | 12 ++ .../executeafm/ExecuteAfmService.java | 107 +++++++++++++ .../executeafm/ExecutionResultException.java | 37 +++++ .../com/gooddata/executeafm/ResultPage.java | 61 ++++++++ .../response/ExecutionResponse.java | 4 +- .../groovy/com/gooddata/GoodDataITBase.groovy | 40 +++++ .../executeafm/ExecuteAfmServiceIT.groovy | 148 ++++++++++++++++++ .../ExecutionResultExceptionTest.groovy | 28 ++++ .../gooddata/executeafm/ResultPageTest.groovy | 39 +++++ .../executeafm/ExecuteAfmServiceAT.java | 88 +++++++++++ 11 files changed, 580 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/ExecuteAfmService.java create mode 100644 src/main/java/com/gooddata/executeafm/ExecutionResultException.java create mode 100644 src/main/java/com/gooddata/executeafm/ResultPage.java create mode 100644 src/test/groovy/com/gooddata/GoodDataITBase.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/ExecutionResultExceptionTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/ResultPageTest.groovy create mode 100644 src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java diff --git a/pom.xml b/pom.xml index 438783949..b4b0cc5a8 100644 --- a/pom.xml +++ b/pom.xml @@ -45,12 +45,30 @@ 1.1.1 1.23.0 2.20.1 + 2.20.1 maven-failsafe-plugin + ${failsafe.version} + + + 1 + + + + org.apache.maven.surefire + surefire-junit47 + ${surefire.version} + + + org.apache.maven.surefire + surefire-testng + ${surefire.version} + + org.codehaus.mojo diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 5b8a4c47e..b7f34f71a 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -10,6 +10,7 @@ import com.gooddata.connector.ConnectorService; import com.gooddata.dataload.OutputStageService; import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.executeafm.ExecuteAfmService; import com.gooddata.export.ExportService; import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.gdc.Header; @@ -93,6 +94,7 @@ public class GoodData { private final ProjectTemplateService projectTemplateService; private final ExportService exportService; private final AuditEventService auditEventService; + private final ExecuteAfmService executeAfmService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -229,6 +231,7 @@ protected GoodData(GoodDataEndpoint endpoint, Authentication authentication, Goo outputStageService = new OutputStageService(getRestTemplate(), settings); projectTemplateService = new ProjectTemplateService(getRestTemplate(), settings); auditEventService = new AuditEventService(getRestTemplate(), accountService, settings); + executeAfmService = new ExecuteAfmService(getRestTemplate(), settings); } static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient httpClient) { @@ -495,5 +498,14 @@ public AuditEventService getAuditEventService() { return auditEventService; } + /** + * Get initialized service for afm execution + * @return initialized service for afm execution + */ + @Bean + public ExecuteAfmService getExecuteAfmService() { + return executeAfmService; + } + } diff --git a/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java b/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java new file mode 100644 index 000000000..fba27c921 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm; + +import com.gooddata.AbstractService; +import com.gooddata.FutureResult; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.GoodDataSettings; +import com.gooddata.PollResult; +import com.gooddata.SimplePollHandler; +import com.gooddata.executeafm.response.ExecutionResponse; +import com.gooddata.executeafm.result.ExecutionResult; +import com.gooddata.project.Project; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import static com.gooddata.util.Validate.notNull; + +/** + * Service for executeAfm resource + */ +public class ExecuteAfmService extends AbstractService { + + private static final String EXECUTION_URI = "/gdc/app/projects/{projectId}/executeAfm"; + private static final String RESULT_OFFSET = "offset"; + private static final String RESULT_LIMIT = "limit"; + + /** + * Service for executeAfm resource + * + * @param restTemplate rest template + * @param settings settings + */ + public ExecuteAfmService(final RestTemplate restTemplate, final GoodDataSettings settings) { + super(restTemplate, settings); + } + + /** + * Executes the given execution returning the execution response + * @param project project of the execution + * @param execution execution + * @return response of the submitted execution + */ + public ExecutionResponse execute(final Project project, final Execution execution) { + final String projectId = notNull(notNull(project, "project").getId(), "projectId"); + final ExecutionResponse response; + try { + response = restTemplate.postForObject( + EXECUTION_URI, + notNull(execution, "execution"), + ExecutionResponse.class, + projectId); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to execute AFM", e); + } + + if (response == null) { + throw new GoodDataException("Empty response when execution posted to API"); + } + + return response; + } + + /** + * Get for result of given response. + * @param executionResponse response to get the result + * @return future of execution result + */ + public FutureResult getResult(final ExecutionResponse executionResponse) { + return new PollResult<>(this, new ExecutionPollHandler(notNull(executionResponse, "executionResponse").getExecutionResultUri())); + } + + /** + * Get for page of result of given response. + * @param executionResponse response to get the result + * @param page desired result page specification + * @return future of execution result + */ + public FutureResult getResult(final ExecutionResponse executionResponse, final ResultPage page) { + final String executionResultUri = notNull(executionResponse, "executionResponse").getExecutionResultUri(); + + final String pagedResultUri = UriComponentsBuilder.fromUriString(executionResultUri) + .replaceQueryParam(RESULT_OFFSET, page.getOffsetsQueryParam()) + .replaceQueryParam(RESULT_LIMIT, page.getLimitsQueryParam()) + .build(true) + .toUriString(); + + return new PollResult<>(this, new ExecutionPollHandler(pagedResultUri)); + } + + private static final class ExecutionPollHandler extends SimplePollHandler { + + ExecutionPollHandler(String pollingUri) { + super(pollingUri, ExecutionResult.class); + } + + @Override + public void handlePollException(GoodDataRestException e) { + throw new ExecutionResultException(e); + } + } +} diff --git a/src/main/java/com/gooddata/executeafm/ExecutionResultException.java b/src/main/java/com/gooddata/executeafm/ExecutionResultException.java new file mode 100644 index 000000000..0e4bc74dc --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/ExecutionResultException.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import org.springframework.http.HttpStatus; + +/** + * Signals problem while fetching {@link com.gooddata.executeafm.result.ExecutionResult} including it's computation + */ +public class ExecutionResultException extends GoodDataException { + + /** + * Creates new instance + * @param cause cause + */ + ExecutionResultException(GoodDataRestException cause) { + super(computeMessage(cause), cause); + } + + private static String computeMessage(GoodDataRestException cause) { + switch (HttpStatus.valueOf(cause.getStatusCode())) { + case BAD_REQUEST: + return "AFM execution is not computable"; + case GONE: + return "AFM execution result no longer available"; + case PAYLOAD_TOO_LARGE: + return "AFM execution result is too large"; + default: + return "AFM execution failed for unknown reason"; + } + } +} diff --git a/src/main/java/com/gooddata/executeafm/ResultPage.java b/src/main/java/com/gooddata/executeafm/ResultPage.java new file mode 100644 index 000000000..e0812f84b --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/ResultPage.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm; + +import com.gooddata.executeafm.response.ExecutionResponse; +import com.gooddata.executeafm.result.ExecutionResult; +import org.springframework.web.util.UriUtils; + +import java.io.UnsupportedEncodingException; +import java.util.List; + +import static com.gooddata.util.Validate.notEmpty; +import static java.util.stream.Collectors.joining; + +/** + * Represents page of {@link ExecutionResult} to be requested, using + * {@link com.gooddata.executeafm.ExecuteAfmService#getResult(ExecutionResponse, ResultPage)} + */ +public class ResultPage { + + private final List offsets; + private final List limits; + + /** + * Creates new instance + * @param offsets list of page offsets + * @param limits list of page limits + */ + public ResultPage(final List offsets, final List limits) { + this.offsets = notEmpty(offsets, "offsets"); + this.limits = notEmpty(limits, "limits"); + if (offsets.size() != limits.size()) { + throw new IllegalArgumentException("Offsets and limits can't have different size."); + } + } + + /** + * @return page offsets joined and URL-encoded to be used as query parameter + */ + String getOffsetsQueryParam() { + return toQueryParam(offsets); + } + + /** + * @return page limits joined and URL-encoded to be used as query parameter + */ + String getLimitsQueryParam() { + return toQueryParam(limits); + } + + private static String toQueryParam(final List list) { + try { + return UriUtils.encode(list.stream().map(String::valueOf).collect(joining(",")), "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException("Missing UTF-8 charset"); + } + } +} diff --git a/src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java b/src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java index 5b3e8ecce..3e2f8d7ac 100644 --- a/src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java +++ b/src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java @@ -72,11 +72,11 @@ public Map getLinks() { /** * Uri referencing the data result location. - * @return execution result uri + * @return execution result uri or throws exception in case the link doesn't exist */ @JsonIgnore public String getExecutionResultUri() { - return notNullState(links, "links").get(EXECUTION_RESULT_LINK); + return notNullState(notNullState(links, "links").get(EXECUTION_RESULT_LINK), EXECUTION_RESULT_LINK); } @Override diff --git a/src/test/groovy/com/gooddata/GoodDataITBase.groovy b/src/test/groovy/com/gooddata/GoodDataITBase.groovy new file mode 100644 index 000000000..4eaa18f8a --- /dev/null +++ b/src/test/groovy/com/gooddata/GoodDataITBase.groovy @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata + +import com.gooddata.authentication.LoginPasswordAuthentication +import spock.lang.Specification + +import static net.jadler.Jadler.closeJadler +import static net.jadler.Jadler.initJadler +import static net.jadler.Jadler.port + + +abstract class GoodDataITBase extends Specification { + + protected GoodData gd + + void setup() { + initJadler().that().respondsWithDefaultContentType('application/json') + gd = new GoodData( + new GoodDataEndpoint('localhost', port(), 'http'), + new LoginPasswordAuthentication('sdk@gooddata.com', 'sdk'), + createGoodDataSettings() + ) + } + + protected GoodDataSettings createGoodDataSettings() { + final GoodDataSettings settings = new GoodDataSettings() + settings.setPollSleep(0) + return settings + } + + protected abstract T getService() + + void cleanup() { + closeJadler() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy b/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy new file mode 100644 index 000000000..c5d17662e --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm + +import com.gooddata.GoodDataException +import com.gooddata.GoodDataITBase +import com.gooddata.executeafm.afm.Afm +import com.gooddata.executeafm.afm.AttributeItem +import com.gooddata.executeafm.afm.MeasureItem +import com.gooddata.executeafm.afm.SimpleMeasureDefinition +import com.gooddata.executeafm.response.* +import com.gooddata.executeafm.result.ExecutionResult +import com.gooddata.executeafm.result.Paging +import com.gooddata.project.Project +import spock.lang.Shared +import spock.lang.Unroll + +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.jadler.Jadler.onRequest +import static net.jadler.Jadler.verifyThatRequest +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals + +class ExecuteAfmServiceIT extends GoodDataITBase { + + private static final String DF_URI = '/gdc/md/PROJECT_ID/obj/1' + private static final String ATTR_URI = '/gdc/md/PROJECT_ID/obj/2' + private static final String MEASURE_URI = '/gdc/md/PROJECT_ID/obj/3' + private static final UriObjQualifier ATTR_QUALIFIER = new UriObjQualifier(DF_URI) + private static final UriObjQualifier MEASURE_QUALIFIER = new UriObjQualifier(MEASURE_URI) + + private static final String RESULT_PATH = '/gdc/app/projects/PROJECT_ID/executionResults/6042010690076179456' + private static final String RESULT_PAGE = '&offset=0%2C0&limit=1000%2C1000' + private static final String RESULT_QUERY_BASE = "c=123&q=456&dimensions=2&totals=0%2C0" + private static final String RESULT_QUERY = "$RESULT_QUERY_BASE$RESULT_PAGE" + private static final String RESULT_URI = "$RESULT_PATH?$RESULT_QUERY" + + @Shared + Project project = readObjectFromResource('/project/project.json', Project) + + @Shared + Execution execution = new Execution(new Afm() + .addAttribute(new AttributeItem(ATTR_QUALIFIER, 'a1')) + .addMeasure(new MeasureItem(new SimpleMeasureDefinition(MEASURE_QUALIFIER), 'm1'))) + + @Shared + ExecutionResponse response = new ExecutionResponse([ + new ResultDimension(new AttributeHeader('name', 'a1', DF_URI, 'a1DfId', new AttributeInHeader('aName', ATTR_URI, 'a1Id'))), + new ResultDimension(new MeasureGroupHeader([new MeasureHeaderItem('mName', 'f', 'm1', MEASURE_URI, 'm1Id')])) + ], RESULT_URI) + + def "should execute AFM"() { + given: + onRequest() + .havingMethodEqualTo('POST') + .havingPathEqualTo('/gdc/app/projects/PROJECT_ID/executeAfm') + .havingBody(jsonEquals(execution)) + .respond() + .withBody(OBJECT_MAPPER.writeValueAsString(response)) + .withStatus(200) + + when: + ExecutionResponse executed = service.execute(project, execution) + + then: + executed?.dimensions?.size() == 2 + executed?.executionResultUri == RESULT_URI + } + + def "should handle failed execution request"() { + given: + onRequest() + .havingMethodEqualTo('POST') + .havingPathEqualTo('/gdc/app/projects/PROJECT_ID/executeAfm') + .havingBody(jsonEquals(execution)) + .respond() + .withStatus(400) + + when: + service.execute(project, execution) + + then: + def ex = thrown(GoodDataException) + ex.message == 'Unable to execute AFM' + } + + @Unroll + def "should get result #order page"() { + given: + ExecutionResult result = new ExecutionResult(new String[0], new Paging([0], [0], [0])) + + onRequest() + .respond() + .withStatus(202) + .thenRespond() + .withBody(OBJECT_MAPPER.writeValueAsString(result)) + .withStatus(200) + + when: + getResult(service).get() + + then: + verifyThatRequest() + .havingMethodEqualTo('GET') + .havingPathEqualTo(RESULT_PATH) + .havingQueryStringEqualTo(resultQuery) + .receivedTimes(2) + + where: + order | resultQuery | getResult + '1st' | RESULT_QUERY | {it.getResult(response)} + '2nd' | "$RESULT_QUERY_BASE&offset=1%2C0&limit=10%2C10" | {it.getResult(response, new ResultPage([1, 0], [10, 10]))} + } + + @Unroll + def "should handle failed result with status #statusCode"() { + given: + onRequest() + .havingMethodEqualTo('GET') + .havingPathEqualTo(RESULT_PATH) + .havingQueryStringEqualTo(RESULT_QUERY) + .respond() + .withStatus(statusCode) + + when: + service.getResult(response).get() + + then: + def ex = thrown(ExecutionResultException) + ex ==~ pattern + + where: + statusCode | pattern + 400 | /.*is not computable.*/ + 410 | /.*result no longer available.*/ + 413 | /.*result is too large.*/ + 500 | /.*failed.*unknown.*reason.*/ + + } + + @Override + protected ExecuteAfmService getService() { + return gd.executeAfmService + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/ExecutionResultExceptionTest.groovy b/src/test/groovy/com/gooddata/executeafm/ExecutionResultExceptionTest.groovy new file mode 100644 index 000000000..b43f25a44 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/ExecutionResultExceptionTest.groovy @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm + +import com.gooddata.GoodDataRestException +import spock.lang.Specification +import spock.lang.Unroll + + +class ExecutionResultExceptionTest extends Specification { + + @Unroll + def "should create with status #code"() { + expect: + new ExecutionResultException(new GoodDataRestException(code, 'reqId', 'status', null)) + .message ==~ msgPattern + + where: + code | msgPattern + 400 | /.*is not computable.*/ + 410 | /.*result no longer available.*/ + 413 | /.*result is too large.*/ + 500 | /.*failed.*unknown.*reason.*/ + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/ResultPageTest.groovy b/src/test/groovy/com/gooddata/executeafm/ResultPageTest.groovy new file mode 100644 index 000000000..328103641 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/ResultPageTest.groovy @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm + +import spock.lang.Specification +import spock.lang.Unroll + + +class ResultPageTest extends Specification { + + @Unroll + def "should not create with #args"() { + when: + new ResultPage(offsets, limits) + + then: + thrown(IllegalArgumentException) + + where: + args | offsets | limits + 'null offsets' | null | [1] + 'null limits' | [1] | null + 'empty offsets' | [] | [1] + 'empty limits' | [1] | [] + 'different size' | [1, 2] | [1] + } + + def "should get query params"() { + when: + def page = new ResultPage([1, 2], [7, 8]) + + then: + page.offsetsQueryParam == '1%2C2' + page.limitsQueryParam == '7%2C8' + } +} diff --git a/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java b/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java new file mode 100644 index 000000000..ad7eb1cf2 --- /dev/null +++ b/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.executeafm.afm.Afm; +import com.gooddata.executeafm.afm.AttributeItem; +import com.gooddata.executeafm.afm.MeasureItem; +import com.gooddata.executeafm.afm.SimpleMeasureDefinition; +import com.gooddata.executeafm.response.AttributeHeader; +import com.gooddata.executeafm.response.ExecutionResponse; +import com.gooddata.executeafm.response.MeasureGroupHeader; +import com.gooddata.executeafm.response.ResultDimension; +import com.gooddata.executeafm.result.DataList; +import com.gooddata.executeafm.result.DataValue; +import com.gooddata.executeafm.result.ExecutionResult; +import com.gooddata.executeafm.result.ResultHeaderItem; +import org.testng.annotations.Test; + +import java.util.Collection; +import java.util.List; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static java.util.stream.Collectors.toList; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasSize; + +public class ExecuteAfmServiceAT extends AbstractGoodDataAT { + + private ExecutionResponse response; + + @Test(dependsOnGroups = {"model", "md", "dataset"}) + public void testExecuteAfm() { + final Execution execution = new Execution(new Afm() + .addAttribute(new AttributeItem(new IdentifierObjQualifier(attr.getDefaultDisplayForm().getIdentifier()), "a1")) + .addMeasure(new MeasureItem(new SimpleMeasureDefinition(new UriObjQualifier(metric.getUri())), "m1")) + ); + + response = gd.getExecuteAfmService().execute(project, execution); + + assertThat(response, notNullValue()); + assertThat("should have 2 dimensions", response.getDimensions(), hasSize(2)); + + final ResultDimension firstDim = response.getDimensions().get(0); + assertThat("1st dim should have 1 header", firstDim.getHeaders(), hasSize(1)); + assertThat("1st dim 1st header should be AttributeHeader", firstDim.getHeaders().get(0), instanceOf(AttributeHeader.class)); + final AttributeHeader attrHeader = (AttributeHeader) firstDim.getHeaders().get(0); + assertThat("header's formOf should point to given attribute", attrHeader.getFormOf().getUri(), is(attr.getUri())); + + final ResultDimension secondDim = response.getDimensions().get(1); + assertThat("2nd dim should have 1 header", secondDim.getHeaders(), hasSize(1)); + assertThat("2nd dim 1st header should be MeasureGroupHeader", secondDim.getHeaders().get(0), instanceOf(MeasureGroupHeader.class)); + final MeasureGroupHeader measureGroupHeader = (MeasureGroupHeader) secondDim.getHeaders().get(0); + assertThat(measureGroupHeader.getItems(), hasSize(1)); + assertThat("the only measureHeader should point to given metric", measureGroupHeader.getItems().get(0).getUri(), is(metric.getUri())); + } + + @Test(dependsOnMethods = "testExecuteAfm") + public void testGetResult() { + final ExecutionResult result = gd.getExecuteAfmService().getResult(response).get(); + + assertThat(result, notNullValue()); + + final List firstDimHeaders = result.getHeaderItems().get(0).get(0); + assertThat("1st dim should have two header items", firstDimHeaders, hasSize(2)); + assertThat(headerItemsNames(firstDimHeaders), hasItems("HR", "DevOps")); + + final List secondDimHeaders = result.getHeaderItems().get(1).get(0); + assertThat("2nd dim should have one header item", secondDimHeaders, hasSize(1)); + assertThat(headerItemsNames(secondDimHeaders), hasItems(metric.getTitle())); + + assertThat(result.getData(), is(new DataList(asList( + new DataList(singletonList(new DataValue("41"))), + new DataList(singletonList(new DataValue("36"))))))); + } + + private static Collection headerItemsNames(final List items) { + return items.stream().map(ResultHeaderItem::getName).collect(toList()); + } +} \ No newline at end of file From d925cfb063d991642febf3ad537694cdbc68ba3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 22 Jan 2018 16:43:06 +0100 Subject: [PATCH 033/548] fix: match the changed error message in dataset upload --- src/test/java/com/gooddata/dataset/DatasetServiceAT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index f3620e65e..a52479a67 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -59,7 +59,7 @@ public void loadDatasetFail(){ datasetService.loadDataset(project, manifest, readFromResource("/corruptedPerson.csv")).get(); fail(); } catch (DatasetException ex){ - assertThat(ex.getMessage(),is(equalTo("Load datasets [dataset.person] failed: [Number of columns doesn't corespond on line 3 in dataset.person.csv]"))); + assertThat(ex.getMessage(),is(equalTo("Load datasets [dataset.person] failed: [Number of columns doesn't correspond in dataset.person.csv at line 3]"))); } } @@ -76,7 +76,7 @@ public void loadDatasetBatchFail() throws Exception { datasetService.loadDatasets(project, personManifest, cityManifest).get(); fail(); } catch (DatasetException ex){ - assertThat(ex.getMessage(),is(equalTo("Load datasets [dataset.person, dataset.city] failed: [Number of columns doesn't corespond on line 3 in dataset.person.csv]"))); + assertThat(ex.getMessage(),is(equalTo("Load datasets [dataset.person, dataset.city] failed: [Number of columns doesn't correspond in dataset.person.csv at line 3]"))); } } From 2e13d36546ded6654e5c563f6ac544f2bfb3979c Mon Sep 17 00:00:00 2001 From: Peter Lacko Date: Tue, 23 Jan 2018 08:39:57 +0100 Subject: [PATCH 034/548] Add Serializable interface to AbstractObj --- src/main/java/com/gooddata/gdc/UriResponse.java | 5 ++++- src/main/java/com/gooddata/md/AbstractObj.java | 5 ++++- src/main/java/com/gooddata/md/Attachment.java | 5 ++++- .../java/com/gooddata/md/AttributeDisplayForm.java | 3 +++ src/main/java/com/gooddata/md/AttributeSort.java | 4 +++- src/main/java/com/gooddata/md/Column.java | 7 ++++++- src/main/java/com/gooddata/md/DataLoadingColumn.java | 8 ++++++-- src/main/java/com/gooddata/md/Dataset.java | 6 +++++- src/main/java/com/gooddata/md/Dimension.java | 7 ++++++- src/main/java/com/gooddata/md/DisplayForm.java | 11 +++++++++-- src/main/java/com/gooddata/md/Expression.java | 5 ++++- src/main/java/com/gooddata/md/Fact.java | 7 ++++++- src/main/java/com/gooddata/md/Key.java | 5 ++++- src/main/java/com/gooddata/md/MaqlAst.java | 6 ++++-- src/main/java/com/gooddata/md/Meta.java | 1 + src/main/java/com/gooddata/md/Metric.java | 6 +++++- src/main/java/com/gooddata/md/NestedAttribute.java | 7 ++++++- src/main/java/com/gooddata/md/ProjectDashboard.java | 8 ++++++-- src/main/java/com/gooddata/md/ScheduledMail.java | 7 ++++++- src/main/java/com/gooddata/md/ScheduledMailWhen.java | 6 +++++- src/main/java/com/gooddata/md/Table.java | 5 ++++- src/main/java/com/gooddata/md/TableDataLoad.java | 6 +++++- .../java/com/gooddata/md/report/AttributeInGrid.java | 4 +++- src/main/java/com/gooddata/md/report/Filter.java | 5 ++++- src/main/java/com/gooddata/md/report/Grid.java | 4 +++- .../md/report/GridReportDefinitionContent.java | 1 + .../java/com/gooddata/md/report/MetricElement.java | 5 ++++- src/main/java/com/gooddata/md/report/MetricGroup.java | 5 ++++- .../md/report/OneNumberReportDefinitionContent.java | 8 ++++++-- src/main/java/com/gooddata/md/report/Report.java | 7 ++++++- .../java/com/gooddata/md/report/ReportDefinition.java | 2 ++ .../gooddata/md/report/ReportDefinitionContent.java | 4 +++- src/test/java/com/gooddata/gdc/UriResponseTest.java | 9 +++++++++ .../com/gooddata/md/AttributeDisplayFormTest.java | 10 ++++++++++ src/test/java/com/gooddata/md/AttributeSortTest.java | 10 ++++++++++ src/test/java/com/gooddata/md/ColumnTest.java | 9 +++++++++ .../java/com/gooddata/md/DataLoadingColumnTest.java | 8 ++++++++ src/test/java/com/gooddata/md/DatasetTest.java | 9 +++++++++ src/test/java/com/gooddata/md/DimensionTest.java | 9 +++++++++ src/test/java/com/gooddata/md/DisplayFormTest.java | 9 +++++++++ src/test/java/com/gooddata/md/ExpressionTest.java | 10 ++++++++++ src/test/java/com/gooddata/md/FactTest.java | 8 ++++++++ src/test/java/com/gooddata/md/KeyTest.java | 10 ++++++++++ src/test/java/com/gooddata/md/MetaTest.java | 9 +++++++++ src/test/java/com/gooddata/md/MetricTest.java | 9 +++++++++ .../java/com/gooddata/md/NestedAttributeTest.java | 11 +++++++++++ .../java/com/gooddata/md/ProjectDashboardTest.java | 9 +++++++++ src/test/java/com/gooddata/md/ScheduledMailTest.java | 9 +++++++++ src/test/java/com/gooddata/md/TableDataLoadTest.java | 10 ++++++++++ src/test/java/com/gooddata/md/TableTest.java | 9 +++++++++ .../com/gooddata/md/report/AttributeInGridTest.java | 9 +++++++++ .../md/report/GridReportDefinitionContentTest.java | 9 +++++++++ src/test/java/com/gooddata/md/report/GridTest.java | 9 +++++++++ .../com/gooddata/md/report/MetricElementTest.java | 9 +++++++++ .../report/OneNumberReportDefinitionContentTest.java | 10 ++++++++++ .../md/report/ReportDefinitionContentTest.java | 10 ++++++++++ src/test/java/com/gooddata/md/report/ReportTest.java | 8 ++++++++ 57 files changed, 373 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index 562ec27f5..f7b36611a 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -11,6 +11,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Response containing URI string. *

@@ -18,8 +20,9 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class UriResponse { +public class UriResponse implements Serializable { + private static final long serialVersionUID = 7622971178590505890L; private final String uri; @JsonCreator diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index 9779d7690..0f8dab755 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -10,6 +10,7 @@ import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.DateTime; +import java.io.Serializable; import java.util.Set; import static com.gooddata.util.Validate.noNullElements; @@ -17,7 +18,9 @@ /** * Metadata object (common part) */ -public abstract class AbstractObj { +public abstract class AbstractObj implements Serializable { + + private static final long serialVersionUID = 2910760851810495274L; @JsonProperty("meta") protected final Meta meta; diff --git a/src/main/java/com/gooddata/md/Attachment.java b/src/main/java/com/gooddata/md/Attachment.java index 3e2afbd64..60f9b0994 100644 --- a/src/main/java/com/gooddata/md/Attachment.java +++ b/src/main/java/com/gooddata/md/Attachment.java @@ -13,6 +13,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Common ancestor to {@link ScheduledMail} attachments. */ @@ -23,8 +25,9 @@ @JsonSubTypes.Type(name = "reportAttachment", value = ReportAttachment.class), }) @JsonInclude(JsonInclude.Include.NON_NULL) -public class Attachment { +public class Attachment implements Serializable { + private static final long serialVersionUID = -3210630720136793710L; private final String uri; @JsonCreator diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 505390dbf..ae15f12c9 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -25,6 +25,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class AttributeDisplayForm extends DisplayForm implements Updatable { + private static final long serialVersionUID = -7903851496647992573L; + @JsonProperty("content") protected final Content content; @@ -53,6 +55,7 @@ public String toString() { @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content extends DisplayForm.Content { + private static final long serialVersionUID = -8502672468934478137L; private final boolean isDefault; private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, diff --git a/src/main/java/com/gooddata/md/AttributeSort.java b/src/main/java/com/gooddata/md/AttributeSort.java index 27bcf5a45..380485684 100644 --- a/src/main/java/com/gooddata/md/AttributeSort.java +++ b/src/main/java/com/gooddata/md/AttributeSort.java @@ -20,14 +20,16 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.io.IOException; +import java.io.Serializable; /** * Internal representation of attribute sort field. Which can be either plain text value or structure pointing to display form. */ @JsonDeserialize(using = AttributeSort.Deserializer.class) @JsonSerialize(using = AttributeSort.Serializer.class) -class AttributeSort { +class AttributeSort implements Serializable { + private static final long serialVersionUID = -7415504020870223701L; static final String PK = "pk"; static final String BY_USED_DF = "byUsedDF"; diff --git a/src/main/java/com/gooddata/md/Column.java b/src/main/java/com/gooddata/md/Column.java index 6409e015c..604b9499e 100644 --- a/src/main/java/com/gooddata/md/Column.java +++ b/src/main/java/com/gooddata/md/Column.java @@ -12,6 +12,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Represents physical data model column. Doesn't implement all fields right now. * Deserialization only. @@ -20,6 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) public class Column extends AbstractObj implements Queryable { + private static final long serialVersionUID = 8235010456787885263L; public static final String TYPE_PK = "pk"; public static final String TYPE_INPUT_PK = "inputpk"; public static final String TYPE_FK = "fk"; @@ -95,7 +98,9 @@ public String toString() { } @JsonIgnoreProperties(ignoreUnknown = true) - private static class Content { + private static class Content implements Serializable { + + private static final long serialVersionUID = -8830741484051984963L; private final String table; private final String columnDBName; private final String columnType; diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java index a3b17f434..c98d092ea 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -15,6 +15,8 @@ import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Represents datasets' loading column. * Deserialization only. @@ -24,6 +26,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class DataLoadingColumn extends AbstractObj implements Queryable { + private static final long serialVersionUID = -1280718594585386535L; private static final String INT = "INT"; private static final String VARCHAR = "VARCHAR"; @@ -94,8 +97,9 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - private static class Content { + private static class Content implements Serializable { + private static final long serialVersionUID = 3821238884831793602L; private final UriResponse columnUri; private final String columnName; private final String columnType; @@ -158,7 +162,7 @@ public String toString() { } } - private static class ColumnSynchronize { + private static class ColumnSynchronize implements Serializable { private final String type; private final Integer length; private final Integer precision; diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index 2f59f24d5..29a7bc14a 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collections; import java.util.List; import java.util.Map; @@ -31,6 +32,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Dataset extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = -6510493111358411706L; private static final String DATA_UPLOADS_LINK = "dataUploads"; private static final String UPLOAD_CONFIGURATION_LINK = "uploadConfiguration"; @@ -120,7 +122,9 @@ public String toString() { } @JsonInclude(JsonInclude.Include.NON_NULL) - private static class Content { + private static class Content implements Serializable { + + private static final long serialVersionUID = -8819963869909114313L; private final List ties; private final String mode; private final List facts; diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index 46c6d27d1..43d161031 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; import java.util.Collections; @@ -24,6 +25,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Dimension extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = -6667238416764957848L; + @JsonProperty("content") private final Content content; @@ -48,7 +51,9 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - private static class Content { + private static class Content implements Serializable { + + private static final long serialVersionUID = -6382409825359596163L; @JsonProperty("attributes") private final Collection attributes; diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 8d68cc56b..a4676467c 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -12,6 +12,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Display form */ @@ -19,6 +21,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class DisplayForm extends AbstractObj { + private static final long serialVersionUID = 8719802319193893780L; + @JsonProperty("content") protected final Content content; @@ -75,8 +79,9 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) - protected static class Content { + protected static class Content implements Serializable { + private static final long serialVersionUID = 6865880678569437635L; private final String formOf; private final String expression; private final String ldmExpression; @@ -115,7 +120,9 @@ public String toString() { } @JsonIgnoreProperties(ignoreUnknown = true) - protected static class Links { + protected static class Links implements Serializable { + + private static final long serialVersionUID = 1704085675250093860L; private final String elements; @JsonCreator diff --git a/src/main/java/com/gooddata/md/Expression.java b/src/main/java/com/gooddata/md/Expression.java index 7fc1975c2..9f2e13ae7 100644 --- a/src/main/java/com/gooddata/md/Expression.java +++ b/src/main/java/com/gooddata/md/Expression.java @@ -11,13 +11,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Expression of fact */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class Expression { +public class Expression implements Serializable { + private static final long serialVersionUID = 9161488874222662015L; private final String data; private final String type; diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index 5711ce575..737509f56 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; import static java.util.Collections.singletonList; @@ -25,6 +26,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Fact extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = 1394960609414171940L; + @JsonProperty("content") private final Content content; @@ -60,7 +63,9 @@ public String toString() { } @JsonInclude(JsonInclude.Include.NON_NULL) - private static class Content { + private static class Content implements Serializable { + + private static final long serialVersionUID = 2141254685536566363L; @JsonProperty("expr") private final Collection expression; diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index e3fb91b59..36c897703 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -11,13 +11,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Key (primary/foreign) of attribute */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class Key { +public class Key implements Serializable { + private static final long serialVersionUID = -2014349746875945306L; private final String data; private final String type; diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/src/main/java/com/gooddata/md/MaqlAst.java index b5658a5f8..fd950630f 100644 --- a/src/main/java/com/gooddata/md/MaqlAst.java +++ b/src/main/java/com/gooddata/md/MaqlAst.java @@ -10,14 +10,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Arrays; /** * MAQL AST representation */ @JsonInclude(JsonInclude.Include.NON_NULL) -public class MaqlAst { +public class MaqlAst implements Serializable { + private static final long serialVersionUID = 7392437285242701220L; private final String type; private final MaqlAstPosition position; @@ -65,7 +67,7 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - public static class MaqlAstPosition { + public static class MaqlAstPosition implements Serializable { private final int line; private final int column; diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index b38177b61..a43a0c525 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -27,6 +27,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Meta implements Serializable { + private static final long serialVersionUID = -8102041850487115166L; private static final int SUMMARY_MAX_LENGTH = 2048; private static final int TITLE_MAX_LENGTH = 255; diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index e9fcea941..853c660bb 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; /** @@ -25,6 +26,8 @@ @JsonIgnoreProperties("links") public class Metric extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = -1666713447809179661L; + @JsonProperty("content") private final Content content; @@ -68,8 +71,9 @@ public String toString() { } @JsonInclude(JsonInclude.Include.NON_NULL) - private static class Content { + private static class Content implements Serializable { + private static final long serialVersionUID = 7959588028233637749L; private final String expression; @JsonProperty("format") diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index c77d0f7b4..05719f6b2 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.*; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; /** @@ -18,6 +19,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class NestedAttribute extends AbstractObj { + private static final long serialVersionUID = -5733300152707435624L; + @JsonProperty("content") private final Content content; @@ -176,7 +179,9 @@ public String toString() { } @JsonInclude(JsonInclude.Include.NON_NULL) - protected static class Content { + protected static class Content implements Serializable { + + private static final long serialVersionUID = -6828025725075482356L; private final Collection pk; private final Collection fk; private final Collection displayForms; diff --git a/src/main/java/com/gooddata/md/ProjectDashboard.java b/src/main/java/com/gooddata/md/ProjectDashboard.java index 5641b0912..dcd3521d9 100644 --- a/src/main/java/com/gooddata/md/ProjectDashboard.java +++ b/src/main/java/com/gooddata/md/ProjectDashboard.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.Objects; @@ -32,6 +33,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class ProjectDashboard extends AbstractObj implements Queryable { + private static final long serialVersionUID = 6791559547484536326L; private final Content content; private ProjectDashboard(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { @@ -80,8 +82,9 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) - private static class Content { + private static class Content implements Serializable { + private static final long serialVersionUID = -3540410868419025134L; private final Collection tabs; @JsonProperty("filters") @@ -104,8 +107,9 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) - public static class Tab { + public static class Tab implements Serializable { + private static final long serialVersionUID = 4755791353382871571L; private final String identifier; private final String title; diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 0f7983b4b..0e6eb3b41 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -12,6 +12,7 @@ import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.LocalDate; +import java.io.Serializable; import java.util.*; import static com.gooddata.util.Validate.notNull; @@ -25,6 +26,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class ScheduledMail extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = -4433891105896592638L; + @JsonProperty("content") private final Content content; @@ -83,7 +86,9 @@ public ScheduledMail(String title, String summary, String recurrency, LocalDate /** * Mail schedule MD object payload. */ - private static class Content { + private static class Content implements Serializable { + + private static final long serialVersionUID = -6676890634279968527L; @JsonProperty("when") private ScheduledMailWhen scheduledMailWhen; diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/src/main/java/com/gooddata/md/ScheduledMailWhen.java index 0795ddefe..801303e3c 100644 --- a/src/main/java/com/gooddata/md/ScheduledMailWhen.java +++ b/src/main/java/com/gooddata/md/ScheduledMailWhen.java @@ -15,10 +15,14 @@ import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.LocalDate; +import java.io.Serializable; + /** * Represents the start date and cron-like expression for {@link com.gooddata.md.ScheduledMail} mail schedule. */ -public class ScheduledMailWhen { +public class ScheduledMailWhen implements Serializable { + + private static final long serialVersionUID = 1203170008606357967L; /** * Cron like recurrency pattern. Example: "0:0:0:1*12:0:0". diff --git a/src/main/java/com/gooddata/md/Table.java b/src/main/java/com/gooddata/md/Table.java index f49da0725..cf0811e69 100644 --- a/src/main/java/com/gooddata/md/Table.java +++ b/src/main/java/com/gooddata/md/Table.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; /** @@ -22,6 +23,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) public class Table extends AbstractObj implements Queryable { + private static final long serialVersionUID = 8188850708608710066L; private final Content content; @JsonCreator @@ -64,8 +66,9 @@ public String toString() { } @JsonIgnoreProperties(ignoreUnknown = true) - private static class Content { + private static class Content implements Serializable { + private static final long serialVersionUID = -3487498890189149368L; private final String tableDBName; private final String activeDataLoad; private final Collection tableDataLoads; diff --git a/src/main/java/com/gooddata/md/TableDataLoad.java b/src/main/java/com/gooddata/md/TableDataLoad.java index 657fafe09..824d17fa0 100644 --- a/src/main/java/com/gooddata/md/TableDataLoad.java +++ b/src/main/java/com/gooddata/md/TableDataLoad.java @@ -12,6 +12,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + /** * Represents data load of physical table. * Deserialization only. @@ -20,6 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) public class TableDataLoad extends AbstractObj implements Queryable { + private static final long serialVersionUID = -5209417147612785042L; public static final String TYPE_FULL = "full"; public static final String TYPE_INCREMENTAL = "incremental"; @@ -65,8 +68,9 @@ public String toString() { } @JsonIgnoreProperties(ignoreUnknown = true) - private static class Content { + private static class Content implements Serializable { + private static final long serialVersionUID = 3566067131546271394L; private final String dataSourceLocation; private final String typeOfLoad; diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index ae5c15094..d6cc56c98 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -16,6 +16,7 @@ import com.gooddata.md.DisplayForm; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -29,8 +30,9 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class AttributeInGrid implements GridElement { +public class AttributeInGrid implements GridElement, Serializable { + private static final long serialVersionUID = 9061580138440068825L; private final String uri; private final String alias; private final List> totals; diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java index 621dbaeea..40d92fd68 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -11,6 +11,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + import static com.gooddata.util.Validate.notEmpty; /** @@ -18,8 +20,9 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class Filter { +public class Filter implements Serializable { + private static final long serialVersionUID = 5776136459952322123L; private final String expression; @JsonCreator diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index 9caec5b76..28e4d3dcf 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; @@ -24,8 +25,9 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class Grid { +public class Grid implements Serializable { + private static final long serialVersionUID = -1274604506924273761L; private final List columns; private final List rows; private final List metrics; diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index f74ea1c5b..ccb6c77f0 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -20,6 +20,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class GridReportDefinitionContent extends ReportDefinitionContent { + private static final long serialVersionUID = 1296467241365069724L; public static final String FORMAT = "grid"; @JsonCreator diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index 8fa064fe1..a80dfc895 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -12,6 +12,8 @@ import com.gooddata.md.Metric; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; + import static com.gooddata.util.Validate.notNull; /** @@ -19,8 +21,9 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class MetricElement { +public class MetricElement implements Serializable { + private static final long serialVersionUID = 6199743301553304055L; private final String uri; private final String alias; private final String format; diff --git a/src/main/java/com/gooddata/md/report/MetricGroup.java b/src/main/java/com/gooddata/md/report/MetricGroup.java index 0e852d8cb..833956416 100644 --- a/src/main/java/com/gooddata/md/report/MetricGroup.java +++ b/src/main/java/com/gooddata/md/report/MetricGroup.java @@ -5,12 +5,15 @@ */ package com.gooddata.md.report; +import java.io.Serializable; + /** * Marker element marking the placement of metrics in Grid report. * Can be contained either in rows or columns of {@link Grid}. */ -public final class MetricGroup implements GridElement { +public final class MetricGroup implements GridElement, Serializable { + private static final long serialVersionUID = -2971228185501817988L; private static final String JSON_VALUE = "metricGroup"; private final String value; diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index 560139aa9..47d80bd58 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -20,6 +21,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class OneNumberReportDefinitionContent extends ReportDefinitionContent { + private static final long serialVersionUID = 5479509323034916986L; public static final String FORMAT = "oneNumber"; private final OneNumberVisualization oneNumber; @@ -47,8 +49,9 @@ public OneNumberVisualization getOneNumber() { } @JsonInclude(JsonInclude.Include.NON_NULL) - private static class OneNumberVisualization { + private static class OneNumberVisualization implements Serializable { + private static final long serialVersionUID = 1105233720917978784L; private final OneNumberLabels labels; @JsonCreator @@ -62,8 +65,9 @@ public OneNumberLabels getLabels() { } @JsonInclude(JsonInclude.Include.NON_NULL) - private static class OneNumberLabels { + private static class OneNumberLabels implements Serializable { + private static final long serialVersionUID = 6464599509495095669L; private final String description; @JsonCreator diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index a7ad104c3..a416ff154 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; import static java.util.Arrays.asList; @@ -30,6 +31,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Report extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = 189440633045112981L; + @JsonProperty("content") private final Content content; @@ -64,7 +67,9 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - private static class Content { + private static class Content implements Serializable { + + private static final long serialVersionUID = 3437452191500594445L; private final Collection definitions; private final Collection domains; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index cc720c0eb..0671f72ff 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -29,7 +29,9 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class ReportDefinition extends AbstractObj implements Queryable, Updatable { + private static final long serialVersionUID = 9069611345896541468L; private static final String EXPLAIN_LINK = "explain2"; + @JsonProperty("content") private final ReportDefinitionContent content; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index b9e0bb6a1..87cf8a341 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Collection; /** @@ -24,8 +25,9 @@ //TODO chart }) @JsonInclude(JsonInclude.Include.NON_NULL) -public abstract class ReportDefinitionContent { +public abstract class ReportDefinitionContent implements Serializable { + private static final long serialVersionUID = -9027442077911353550L; private final String format; private final Grid grid; private final Collection filters; diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java index f9fd89d32..5e97db3bc 100644 --- a/src/test/java/com/gooddata/gdc/UriResponseTest.java +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.gdc; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -28,4 +29,12 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { assertThat(new UriResponse("URI"), jsonEquals(resource("gdc/uriResponse.json"))); } + + @Test + public void testSerializable() throws Exception { + final UriResponse uriResponse = readObjectFromResource("/gdc/uriResponse.json", UriResponse.class); + final UriResponse deserialized = SerializationUtils.roundtrip(uriResponse); + + assertThat(deserialized, jsonEquals(uriResponse)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 89034a82f..fe241e760 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -62,4 +63,13 @@ public void testToStringFormat() { assertThat(attrDF.toString(), matchesPattern(AttributeDisplayForm.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, + LDM_EXPRESSION, TYPE, ELEMENTS_LINK); + final DisplayForm deserialized = SerializationUtils.roundtrip(attrDF); + + assertThat(deserialized, jsonEquals(attrDF)); + } + } diff --git a/src/test/java/com/gooddata/md/AttributeSortTest.java b/src/test/java/com/gooddata/md/AttributeSortTest.java index 40f32ad83..382c21562 100644 --- a/src/test/java/com/gooddata/md/AttributeSortTest.java +++ b/src/test/java/com/gooddata/md/AttributeSortTest.java @@ -10,6 +10,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; @@ -51,4 +52,13 @@ public void testToStringFormat() { assertThat(attributeSort.toString(), matchesPattern(AttributeSort.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final AttributeSort attributeSort = new AttributeSort("/gdc/md/PROJECT_ID/obj/1806", true); + final AttributeSort deserialized = SerializationUtils.roundtrip(attributeSort); + + assertThat(deserialized, jsonEquals(attributeSort)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ColumnTest.java b/src/test/java/com/gooddata/md/ColumnTest.java index b769ec9cb..b56cbfd4a 100644 --- a/src/test/java/com/gooddata/md/ColumnTest.java +++ b/src/test/java/com/gooddata/md/ColumnTest.java @@ -5,9 +5,11 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -37,4 +39,11 @@ public void testToStringFormat() throws Exception { assertThat(column.toString(), matchesPattern(Column.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Column column = readObjectFromResource("/md/column.json", Column.class); + final Column deserialized = SerializationUtils.roundtrip(column); + + assertThat(deserialized, jsonEquals(column)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java index 1115cc8b0..2d33a57a0 100644 --- a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java +++ b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java @@ -5,9 +5,11 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; @@ -45,5 +47,11 @@ public void testToStringFormat() throws Exception { assertThat(column.toString(), matchesPattern(DataLoadingColumn.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final DataLoadingColumn column = readObjectFromResource("/md/dataLoadingColumn.json", DataLoadingColumn.class); + final DataLoadingColumn deserialized = SerializationUtils.roundtrip(column); + assertThat(deserialized, jsonEquals(column)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java index d8a6ddcfd..b98a9c2e5 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import java.util.List; @@ -66,4 +67,12 @@ public void testToStringFormat() { assertThat(dataset.toString(), matchesPattern(Dataset.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Dataset dataset = new Dataset("Dataset"); + final Dataset deserialized = SerializationUtils.roundtrip(dataset); + + assertThat(deserialized, jsonEquals(dataset)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/DimensionTest.java b/src/test/java/com/gooddata/md/DimensionTest.java index 2e037a43b..12d92a3e6 100644 --- a/src/test/java/com/gooddata/md/DimensionTest.java +++ b/src/test/java/com/gooddata/md/DimensionTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import java.util.Collection; @@ -43,4 +44,12 @@ public void testToStringFormat() { assertThat(dimension.toString(), matchesPattern(Dimension.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final Dimension dimension = new Dimension("Dimension"); + final Dimension deserialized = SerializationUtils.roundtrip(dimension); + + assertThat(deserialized, jsonEquals(dimension)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index 1d0e5cd61..68a626223 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -53,4 +54,12 @@ public void testToStringFormat() { assertThat(displayForm.toString(), matchesPattern(DisplayForm.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final DisplayForm displayForm = new DisplayForm(new Meta("Person Name"), + new DisplayForm.Content(FORM_OF, EXPRESSION, LDM_EXPRESSION, null), new DisplayForm.Links(ELEMENTS_LINK)); + final DisplayForm deserialized = SerializationUtils.roundtrip(displayForm); + + assertThat(deserialized, jsonEquals(displayForm)); + } } diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index 511cc9469..4c7c78413 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -5,9 +5,11 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -39,4 +41,12 @@ public void testToStringFormat() { assertThat(expression.toString(), matchesPattern(Expression.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final Expression expression = new Expression(DATA, TYPE); + final Expression deserialized = SerializationUtils.roundtrip(expression); + + assertThat(deserialized, jsonEquals(expression)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index 5c69ba68d..58d635c3f 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -41,4 +42,11 @@ public void testToStringFormat() { assertThat(fact.toString(), matchesPattern(Fact.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Fact fact = new Fact("Person Shoe Size", "/gdc/md/PROJECT_ID/obj/COL_ID", "col", "/gdc/md/PROJECT_ID/obj/FOLDER_ID"); + final Fact deserialized = SerializationUtils.roundtrip(fact); + + assertThat(deserialized, jsonEquals(fact)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/KeyTest.java b/src/test/java/com/gooddata/md/KeyTest.java index d154ded55..df1b0b3a5 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -5,9 +5,11 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -40,4 +42,12 @@ public void testToStringFormat() { assertThat(key.toString(), matchesPattern(Key.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final Key key = new Key(DATA, TYPE); + final Key deserialized = SerializationUtils.roundtrip(key); + + assertThat(deserialized, jsonEquals(key)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 2670e752f..0525262fa 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -78,4 +79,12 @@ public void testToStringFormat() { assertThat(meta.toString(), matchesPattern(Meta.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, IDENTIFIER, + DEPRECATED, PRODUCTION, LOCKED, UNLISTED, SHARED_WITH_SOMEONE); + final Meta deserialized = SerializationUtils.roundtrip(meta); + + assertThat(deserialized, jsonEquals(meta)); + } } diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index aa9951422..5a2010265 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -70,4 +71,12 @@ public void testToStringFormat() throws Exception { assertThat(metric.toString(), matchesPattern(Metric.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final Metric metric = readObjectFromResource("/md/metric-out.json", Metric.class); + final Metric deserialized = SerializationUtils.roundtrip(metric); + + assertThat(deserialized, jsonEquals(metric)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/NestedAttributeTest.java b/src/test/java/com/gooddata/md/NestedAttributeTest.java index e2359e737..f078c6baa 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -5,12 +5,14 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.hamcrest.Matchers; import org.testng.annotations.Test; import java.util.Collection; import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -65,4 +67,13 @@ public void testToStringFormat() throws Exception { assertThat(attribute.toString(), matchesPattern(NestedAttribute.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final NestedAttribute attribute = readObjectFromResource("/md/dimensionAttribute.json", NestedAttribute.class); + final NestedAttribute deserialized = SerializationUtils.roundtrip(attribute); + + assertThat(deserialized, jsonEquals(attribute)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ProjectDashboardTest.java b/src/test/java/com/gooddata/md/ProjectDashboardTest.java index 5c79f5865..eb6fc345c 100644 --- a/src/test/java/com/gooddata/md/ProjectDashboardTest.java +++ b/src/test/java/com/gooddata/md/ProjectDashboardTest.java @@ -6,6 +6,7 @@ package com.gooddata.md; import com.gooddata.md.ProjectDashboard.Tab; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readObjectFromResource; @@ -47,4 +48,12 @@ public void testToStringFormat() throws Exception { assertThat(dashboard.toString(), matchesPattern(ProjectDashboard.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final ProjectDashboard dashboard = readObjectFromResource("/md/projectDashboard.json", ProjectDashboard.class); + final ProjectDashboard deserialized = SerializationUtils.roundtrip(dashboard); + + assertThat(deserialized, jsonEquals(dashboard)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ScheduledMailTest.java b/src/test/java/com/gooddata/md/ScheduledMailTest.java index cbd3c4d0c..65e0edec8 100644 --- a/src/test/java/com/gooddata/md/ScheduledMailTest.java +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -6,6 +6,7 @@ package com.gooddata.md; import com.gooddata.export.ExportFormat; +import org.apache.commons.lang3.SerializationUtils; import org.joda.time.LocalDate; import org.testng.annotations.Test; @@ -75,4 +76,12 @@ public void testToStringFormat() throws Exception { assertThat(scheduledMail.toString(), matchesPattern(ScheduledMail.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final ScheduledMail scheduledMail = readObjectFromResource("/md/scheduledMail.json", ScheduledMail.class); + final ScheduledMail deserialized = SerializationUtils.roundtrip(scheduledMail); + + assertThat(deserialized, jsonEquals(scheduledMail)); + } + } diff --git a/src/test/java/com/gooddata/md/TableDataLoadTest.java b/src/test/java/com/gooddata/md/TableDataLoadTest.java index 311c819ca..a547e8e79 100644 --- a/src/test/java/com/gooddata/md/TableDataLoadTest.java +++ b/src/test/java/com/gooddata/md/TableDataLoadTest.java @@ -5,9 +5,11 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -33,4 +35,12 @@ public void testToStringFormat() throws Exception { assertThat(load.toString(), matchesPattern(TableDataLoad.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final TableDataLoad load = readObjectFromResource("/md/tableDataLoad.json", TableDataLoad.class); + final TableDataLoad deserialized = SerializationUtils.roundtrip(load); + + assertThat(deserialized, jsonEquals(load)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/TableTest.java b/src/test/java/com/gooddata/md/TableTest.java index ec5dd24fc..0e4cb64ed 100644 --- a/src/test/java/com/gooddata/md/TableTest.java +++ b/src/test/java/com/gooddata/md/TableTest.java @@ -5,9 +5,11 @@ */ package com.gooddata.md; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -35,4 +37,11 @@ public void testToStringFormat() throws Exception { assertThat(table.toString(), matchesPattern(Table.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Table table = readObjectFromResource("/md/table.json", Table.class); + final Table deserialized = SerializationUtils.roundtrip(table); + + assertThat(deserialized, jsonEquals(table)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 821c67311..8df11f182 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -7,6 +7,7 @@ import com.gooddata.md.Attribute; import com.gooddata.md.DisplayForm; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import java.util.Iterator; @@ -88,4 +89,12 @@ public void testToStringFormat() throws Exception { assertThat(attr.toString(), matchesPattern(AttributeInGrid.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final AttributeInGrid attr = readObjectFromResource("/md/report/attributeInGrid.json", AttributeInGrid.class); + final AttributeInGrid deserialized = SerializationUtils.roundtrip(attr); + + assertThat(deserialized, jsonEquals(attr)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index fda7857b8..d91403056 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md.report; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import java.util.Collections; @@ -35,4 +36,12 @@ public void testSerialization() throws Exception { assertThat(def, jsonEquals(resource("md/report/gridReportDefinitionContent-input.json"))); } + @Test + public void testSerializable() throws Exception { + final GridReportDefinitionContent def = (GridReportDefinitionContent) + readObjectFromResource("/md/report/gridReportDefinitionContent.json", ReportDefinitionContent.class); + final GridReportDefinitionContent deserialized = SerializationUtils.roundtrip(def); + + assertThat(deserialized, jsonEquals(def)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index 3347abaca..3610766f7 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md.report; +import org.apache.commons.lang3.SerializationUtils; import org.hamcrest.CoreMatchers; import org.testng.annotations.Test; @@ -78,4 +79,12 @@ public void testToStringFormat() throws Exception { assertThat(grid.toString(), matchesPattern(Grid.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Grid grid = readObjectFromResource("/md/report/grid.json", Grid.class); + final Grid deserialized = SerializationUtils.roundtrip(grid); + + assertThat(deserialized, jsonEquals(grid)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/MetricElementTest.java b/src/test/java/com/gooddata/md/report/MetricElementTest.java index 2d4648d9c..1e1ce2745 100644 --- a/src/test/java/com/gooddata/md/report/MetricElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -6,6 +6,7 @@ package com.gooddata.md.report; import com.gooddata.md.Metric; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -58,4 +59,12 @@ public void testToStringFormat() { assertThat(element.toString(), matchesPattern(MetricElement.class.getSimpleName() + "\\[.*\\]")); } + + @Test + public void testSerializable() throws Exception { + final MetricElement element = new MetricElement(URI, ALIAS, FORMAT, DRILL_URI); + final MetricElement deserialized = SerializationUtils.roundtrip(element); + + assertThat(deserialized, jsonEquals(element)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index d9070e23a..1d4b41236 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md.report; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import java.util.Collections; @@ -36,4 +37,13 @@ public void testSerialization() throws Exception { assertThat(def, jsonEquals(resource("md/report/oneNumberReportDefinitionContent-input.json"))); } + + @Test + public void testSerializable() throws Exception { + final OneNumberReportDefinitionContent def = (OneNumberReportDefinitionContent) + readObjectFromResource("/md/report/oneNumberReportDefinitionContent.json", ReportDefinitionContent.class); + final OneNumberReportDefinitionContent deserialized = SerializationUtils.roundtrip(def); + + assertThat(deserialized, jsonEquals(def)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index 4dd8e765c..7a0350be1 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md.report; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import java.util.Collections; @@ -44,4 +45,13 @@ public void testToStringFormat() { assertThat(def.toString(), matchesPattern(GridReportDefinitionContent.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final ReportDefinitionContent def = new GridReportDefinitionContent( + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); + final ReportDefinitionContent deserialized = SerializationUtils.roundtrip(def); + + assertThat(deserialized, jsonEquals(def)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index d106727b0..93c56659f 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.md.report; +import org.apache.commons.lang3.SerializationUtils; import org.testng.annotations.Test; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -52,4 +53,11 @@ public void testToStringFormat() throws Exception { assertThat(report.toString(), matchesPattern(Report.class.getSimpleName() + "\\[.*\\]")); } + @Test + public void testSerializable() throws Exception { + final Report report = readObjectFromResource("/md/report/report.json", Report.class); + final Report deserialized = SerializationUtils.roundtrip(report); + + assertThat(deserialized, jsonEquals(report)); + } } \ No newline at end of file From 5d175da881b28934a48fdb727014e4cd92ea419e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 25 Jan 2018 08:46:59 +0100 Subject: [PATCH 035/548] trivial: make match failed dataset load message less strict --- .../gooddata/dataset/DatasetServiceAT.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index a52479a67..b27778953 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -5,26 +5,26 @@ */ package com.gooddata.dataset; +import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.Test; + +import java.util.Collection; + import static com.gooddata.util.ResourceUtils.readFromResource; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.testng.Assert.assertFalse; import static org.testng.Assert.fail; -import com.gooddata.AbstractGoodDataAT; -import static org.hamcrest.MatcherAssert.assertThat; - -import org.testng.annotations.Test; - -import java.util.Collection; - /** * Dataset acceptance tests. */ public class DatasetServiceAT extends AbstractGoodDataAT { + private static final String FAILED_LOAD_PATTERN = "Number of columns does(n't| not) co[r]{1,2}espond (in dataset.person.csv at line 3|on line 3 in dataset.person.csv)"; + @Test(groups = "dataset", dependsOnGroups = {"md", "datastore"}) public void loadDataset() throws Exception { final DatasetService datasetService = gd.getDatasetService(); @@ -59,7 +59,7 @@ public void loadDatasetFail(){ datasetService.loadDataset(project, manifest, readFromResource("/corruptedPerson.csv")).get(); fail(); } catch (DatasetException ex){ - assertThat(ex.getMessage(),is(equalTo("Load datasets [dataset.person] failed: [Number of columns doesn't correspond in dataset.person.csv at line 3]"))); + assertThat(ex.getMessage(), matchesPattern(FAILED_LOAD_PATTERN)); } } @@ -76,7 +76,7 @@ public void loadDatasetBatchFail() throws Exception { datasetService.loadDatasets(project, personManifest, cityManifest).get(); fail(); } catch (DatasetException ex){ - assertThat(ex.getMessage(),is(equalTo("Load datasets [dataset.person, dataset.city] failed: [Number of columns doesn't correspond in dataset.person.csv at line 3]"))); + assertThat(ex.getMessage(), matchesPattern("Load datasets [dataset.person, dataset.city] failed: [" + FAILED_LOAD_PATTERN + "]")); } } From 2b1aa3c7eb9fd775782e1f71a476044c33e7d1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 25 Jan 2018 09:22:42 +0100 Subject: [PATCH 036/548] trivial: escape parentheses in regex correctly --- src/test/java/com/gooddata/dataset/DatasetServiceAT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index b27778953..679fc4477 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -59,7 +59,7 @@ public void loadDatasetFail(){ datasetService.loadDataset(project, manifest, readFromResource("/corruptedPerson.csv")).get(); fail(); } catch (DatasetException ex){ - assertThat(ex.getMessage(), matchesPattern(FAILED_LOAD_PATTERN)); + assertThat(ex.getMessage(), matchesPattern("Load datasets \\[dataset.person\\] failed: \\[" + FAILED_LOAD_PATTERN + "\\]")); } } @@ -76,7 +76,7 @@ public void loadDatasetBatchFail() throws Exception { datasetService.loadDatasets(project, personManifest, cityManifest).get(); fail(); } catch (DatasetException ex){ - assertThat(ex.getMessage(), matchesPattern("Load datasets [dataset.person, dataset.city] failed: [" + FAILED_LOAD_PATTERN + "]")); + assertThat(ex.getMessage(), matchesPattern("Load datasets \\[dataset.person, dataset.city\\] failed: \\[" + FAILED_LOAD_PATTERN + "\\]")); } } From 5c1bf8992ac6cf6d6ae3012470494e7b150cdd21 Mon Sep 17 00:00:00 2001 From: Peter Lacko Date: Tue, 12 Dec 2017 09:22:40 +0100 Subject: [PATCH 037/548] Add visualizationObject --- pom.xml | 2 +- .../executeafm/IdentifierObjQualifier.java | 5 +- .../gooddata/executeafm/UriObjQualifier.java | 5 +- .../executeafm/afm/AbsoluteDateFilter.java | 22 +- .../executeafm/afm/AttributeFilter.java | 21 +- .../executeafm/afm/AttributeItem.java | 21 +- .../gooddata/executeafm/afm/DateFilter.java | 20 +- .../executeafm/afm/MeasureDefinition.java | 6 +- .../gooddata/executeafm/afm/MeasureItem.java | 20 +- .../afm/NegativeAttributeFilter.java | 18 + .../executeafm/afm/PopMeasureDefinition.java | 6 +- .../afm/PositiveAttributeFilter.java | 16 + .../executeafm/afm/RelativeDateFilter.java | 26 +- .../afm/SimpleMeasureDefinition.java | 5 +- src/main/java/com/gooddata/md/Obj.java | 4 + .../com/gooddata/md/visualization/Bucket.java | 81 +++++ .../gooddata/md/visualization/BucketItem.java | 24 ++ .../md/visualization/CollectionType.java | 20 ++ .../gooddata/md/visualization/Measure.java | 89 +++++ .../visualization/VOPopMeasureDefinition.java | 38 ++ .../VOSimpleMeasureDefinition.java | 45 +++ .../visualization/VisualizationAttribute.java | 53 +++ .../md/visualization/VisualizationClass.java | 152 ++++++++ .../md/visualization/VisualizationObject.java | 324 ++++++++++++++++++ .../md/visualization/VisualizationType.java | 33 ++ .../IdentifierObjQualifierTest.groovy | 9 + .../executeafm/UriObjQualifierTest.groovy | 9 + .../afm/AbsoluteDateFilterTest.groovy | 14 + .../executeafm/afm/AttributeItemTest.groovy | 8 + .../executeafm/afm/MeasureItemTest.groovy | 18 + .../afm/NegativeAttributeFilterTest.groovy | 15 + .../afm/PopMeasureDefinitionTest.groovy | 9 + .../afm/PositiveAttributeFilterTest.groovy | 15 + .../afm/RelativeDateFilterTest.groovy | 15 + .../afm/SimpleMeasureDefinitionTest.groovy | 9 + .../md/visualization/BucketTest.groovy | 78 +++++ .../md/visualization/MeasureTest.groovy | 74 ++++ .../VisualizationClassTest.groovy | 75 ++++ .../VisualizationObjectTest.groovy | 205 +++++++++++ .../md/visualization/attributeBucket.json | 14 + .../visualization/barVisualizationClass.json | 14 + .../complexVisualizationObject.json | 130 +++++++ .../md/visualization/customChart.json | 48 +++ .../emptyBucketsVisualization.json | 16 + .../externalVisualizationClass.json | 14 + .../md/visualization/measureBucket.json | 22 ++ .../md/visualization/mixedBucket.json | 30 ++ .../multipleAttributesBucket.json | 22 ++ .../multipleMeasureBucketsVisualization.json | 74 ++++ .../visualization/multipleMeasuresBucket.json | 52 +++ .../md/visualization/noItemsBucket.json | 4 + .../md/visualization/segmentedLineChart.json | 66 ++++ .../simpleVisualizationObject.json | 13 + .../md/visualization/stackedColumnChart.json | 66 ++++ .../tableVisualizationClass.json | 14 + 55 files changed, 2192 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/gooddata/md/visualization/Bucket.java create mode 100644 src/main/java/com/gooddata/md/visualization/BucketItem.java create mode 100644 src/main/java/com/gooddata/md/visualization/CollectionType.java create mode 100644 src/main/java/com/gooddata/md/visualization/Measure.java create mode 100644 src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java create mode 100644 src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java create mode 100644 src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java create mode 100644 src/main/java/com/gooddata/md/visualization/VisualizationClass.java create mode 100644 src/main/java/com/gooddata/md/visualization/VisualizationObject.java create mode 100644 src/main/java/com/gooddata/md/visualization/VisualizationType.java create mode 100644 src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy create mode 100644 src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy create mode 100644 src/test/groovy/com/gooddata/md/visualization/VisualizationClassTest.groovy create mode 100644 src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy create mode 100644 src/test/resources/md/visualization/attributeBucket.json create mode 100644 src/test/resources/md/visualization/barVisualizationClass.json create mode 100644 src/test/resources/md/visualization/complexVisualizationObject.json create mode 100644 src/test/resources/md/visualization/customChart.json create mode 100644 src/test/resources/md/visualization/emptyBucketsVisualization.json create mode 100644 src/test/resources/md/visualization/externalVisualizationClass.json create mode 100644 src/test/resources/md/visualization/measureBucket.json create mode 100644 src/test/resources/md/visualization/mixedBucket.json create mode 100644 src/test/resources/md/visualization/multipleAttributesBucket.json create mode 100644 src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json create mode 100644 src/test/resources/md/visualization/multipleMeasuresBucket.json create mode 100644 src/test/resources/md/visualization/noItemsBucket.json create mode 100644 src/test/resources/md/visualization/segmentedLineChart.json create mode 100644 src/test/resources/md/visualization/simpleVisualizationObject.json create mode 100644 src/test/resources/md/visualization/stackedColumnChart.json create mode 100644 src/test/resources/md/visualization/tableVisualizationClass.json diff --git a/pom.xml b/pom.xml index b4b0cc5a8..9c9c3e05c 100644 --- a/pom.xml +++ b/pom.xml @@ -410,7 +410,7 @@ nl.jqno.equalsverifier equalsverifier - 2.3.3 + 2.4.2 test diff --git a/src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java b/src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java index 476c04d21..16958731a 100644 --- a/src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java +++ b/src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java @@ -7,13 +7,16 @@ import com.fasterxml.jackson.annotation.JsonValue; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Objects; /** * Qualifies metadata {@link com.gooddata.md.Obj} using an identifier */ @JsonRootName("identifier") -public final class IdentifierObjQualifier implements ObjQualifier { +public final class IdentifierObjQualifier implements ObjQualifier, Serializable { + + private static final long serialVersionUID = 4398691769334257408L; private final String identifier; public IdentifierObjQualifier(final String identifier) { diff --git a/src/main/java/com/gooddata/executeafm/UriObjQualifier.java b/src/main/java/com/gooddata/executeafm/UriObjQualifier.java index 91c3b2b9a..f8810edca 100644 --- a/src/main/java/com/gooddata/executeafm/UriObjQualifier.java +++ b/src/main/java/com/gooddata/executeafm/UriObjQualifier.java @@ -7,13 +7,16 @@ import com.fasterxml.jackson.annotation.JsonValue; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.Objects; /** * Qualifies metadata {@link com.gooddata.md.Obj} using an URI */ @JsonRootName("uri") -public final class UriObjQualifier implements ObjQualifier { +public final class UriObjQualifier implements ObjQualifier, Serializable { + + private static final long serialVersionUID = 5505403156762360659L; private final String uri; public UriObjQualifier(final String uri) { diff --git a/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java b/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java index d376f5e45..24223c34c 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java @@ -17,14 +17,17 @@ import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.LocalDate; -import static com.gooddata.util.Validate.notNull; +import java.util.Objects; /** * Represents {@link DateFilter} specifying exact from and to dates. */ @JsonRootName(AbsoluteDateFilter.NAME) public class AbsoluteDateFilter extends DateFilter { + + private static final long serialVersionUID = -1857726227400504182L; static final String NAME = "absoluteDateFilter"; + private final LocalDate from; private final LocalDate to; @@ -39,8 +42,8 @@ public AbsoluteDateFilter(@JsonProperty("dataSet") final ObjQualifier dataSet, @JsonProperty("from") @JsonDeserialize(using = GDDateDeserializer.class) final LocalDate from, @JsonProperty("to") @JsonDeserialize(using = GDDateDeserializer.class) final LocalDate to) { super(dataSet); - this.from = notNull(from, "from"); - this.to = notNull(to, "to"); + this.from = from; + this.to = to; } /** @@ -64,6 +67,19 @@ public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { return new AbsoluteDateFilter(qualifier, from, to); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbsoluteDateFilter that = (AbsoluteDateFilter) o; + return super.equals(that) && Objects.equals(from, that.from) && Objects.equals(to, that.to); + } + + @Override + public int hashCode() { + return Objects.hash(from, to, super.hashCode()); + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java b/src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java index b8b7d4ff4..2f8185ebe 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java @@ -7,12 +7,17 @@ import com.gooddata.executeafm.ObjQualifier; +import java.io.Serializable; +import java.util.Objects; + import static com.gooddata.util.Validate.notNull; /** * Represents filter by attribute. */ -public abstract class AttributeFilter implements FilterItem { +public abstract class AttributeFilter implements FilterItem, Serializable { + + private static final long serialVersionUID = 1125099080537899747L; private final ObjQualifier displayForm; /** @@ -34,4 +39,18 @@ public ObjQualifier getDisplayForm() { public ObjQualifier getObjQualifier() { return getDisplayForm(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AttributeFilter that = (AttributeFilter) o; + return Objects.equals(displayForm, that.displayForm); + } + + @Override + public int hashCode() { + return Objects.hash(displayForm); + } + } diff --git a/src/main/java/com/gooddata/executeafm/afm/AttributeItem.java b/src/main/java/com/gooddata/executeafm/afm/AttributeItem.java index 29097ed1b..ba1e13ced 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AttributeItem.java +++ b/src/main/java/com/gooddata/executeafm/afm/AttributeItem.java @@ -11,14 +11,19 @@ import com.gooddata.executeafm.ObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; +import java.util.Objects; + /** * Represents attribute within {@link Afm} */ @JsonInclude(JsonInclude.Include.NON_NULL) -public class AttributeItem implements LocallyIdentifiable { +public class AttributeItem implements LocallyIdentifiable, Serializable { + private static final long serialVersionUID = -1484150046473673413L; private final String localIdentifier; private final ObjQualifier displayForm; + private String alias; /** @@ -77,5 +82,19 @@ public void setAlias(final String alias) { public String toString() { return GoodDataToStringBuilder.defaultToString(this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AttributeItem that = (AttributeItem) o; + return Objects.equals(localIdentifier, that.localIdentifier) && + Objects.equals(displayForm, that.displayForm); + } + + @Override + public int hashCode() { + return Objects.hash(localIdentifier, displayForm); + } } diff --git a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java b/src/main/java/com/gooddata/executeafm/afm/DateFilter.java index 01cabdd74..08333538a 100644 --- a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/DateFilter.java @@ -8,12 +8,17 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.executeafm.ObjQualifier; +import java.io.Serializable; +import java.util.Objects; + import static com.gooddata.util.Validate.notNull; /** * Represents filter by date. */ -public abstract class DateFilter implements FilterItem { +public abstract class DateFilter implements FilterItem, Serializable { + + private static final long serialVersionUID = -804172518160419510L; private final ObjQualifier dataSet; /** @@ -36,4 +41,17 @@ public ObjQualifier getDataSet() { public ObjQualifier getObjQualifier() { return getDataSet(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DateFilter that = (DateFilter) o; + return Objects.equals(dataSet, that.dataSet); + } + + @Override + public int hashCode() { + return Objects.hash(dataSet); + } } diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java index 44b7afffd..3d9b93e08 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java @@ -10,11 +10,15 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.gooddata.executeafm.ObjQualifier; import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.md.visualization.VOPopMeasureDefinition; +import com.gooddata.md.visualization.VOSimpleMeasureDefinition; @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonSubTypes({ @JsonSubTypes.Type(value = SimpleMeasureDefinition.class, name = SimpleMeasureDefinition.NAME), - @JsonSubTypes.Type(value = PopMeasureDefinition.class, name = PopMeasureDefinition.NAME) + @JsonSubTypes.Type(value = PopMeasureDefinition.class, name = PopMeasureDefinition.NAME), + @JsonSubTypes.Type(value = VOSimpleMeasureDefinition.class, name = VOSimpleMeasureDefinition.NAME), + @JsonSubTypes.Type(value = VOPopMeasureDefinition.class, name = VOPopMeasureDefinition.NAME), }) public interface MeasureDefinition { diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureItem.java b/src/main/java/com/gooddata/executeafm/afm/MeasureItem.java index cc02bb169..f536dfa8f 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureItem.java +++ b/src/main/java/com/gooddata/executeafm/afm/MeasureItem.java @@ -11,12 +11,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; +import java.util.Objects; + /** * Represents measure within {@link Afm} */ @JsonInclude(JsonInclude.Include.NON_NULL) -public class MeasureItem implements LocallyIdentifiable { +public class MeasureItem implements LocallyIdentifiable, Serializable { + private static final long serialVersionUID = -8641866340075567437L; private final MeasureDefinition definition; private final String localIdentifier; private String alias; @@ -92,4 +96,18 @@ public String toString() { public boolean isAdHoc() { return definition.isAdHoc(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MeasureItem that = (MeasureItem) o; + return Objects.equals(definition, that.definition) && + Objects.equals(localIdentifier, that.localIdentifier); + } + + @Override + public int hashCode() { + return Objects.hash(definition, localIdentifier); + } } diff --git a/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java b/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java index 1e9c0dfc3..dfe5c1f18 100644 --- a/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java @@ -13,6 +13,7 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; +import java.util.Objects; import static java.util.Arrays.asList; @@ -21,7 +22,10 @@ */ @JsonRootName(NegativeAttributeFilter.NAME) public class NegativeAttributeFilter extends AttributeFilter { + + private static final long serialVersionUID = -6202625318104289333L; static final String NAME = "negativeAttributeFilter"; + private final List notIn; /** @@ -56,4 +60,18 @@ public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { public String toString() { return GoodDataToStringBuilder.defaultToString(this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NegativeAttributeFilter that = (NegativeAttributeFilter) o; + return super.equals(that) && Objects.equals(notIn, that.notIn); + } + + @Override + public int hashCode() { + return Objects.hash(notIn, super.hashCode()); + } + } diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java index e014a2ff1..b6dfcbf62 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java @@ -11,14 +11,18 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; +import java.util.Objects; + import static com.gooddata.executeafm.afm.PopMeasureDefinition.NAME; /** * Definition of so called "period over period" measure */ @JsonRootName(NAME) -public class PopMeasureDefinition implements MeasureDefinition { +public class PopMeasureDefinition implements MeasureDefinition, Serializable { + private static final long serialVersionUID = 1430640153994197345L; static final String NAME = "popMeasure"; private final String measureIdentifier; diff --git a/src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java b/src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java index 75c2fb299..e1023208d 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java @@ -13,6 +13,7 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; +import java.util.Objects; import static java.util.Arrays.asList; @@ -21,6 +22,8 @@ */ @JsonRootName(PositiveAttributeFilter.NAME) public class PositiveAttributeFilter extends AttributeFilter { + + private static final long serialVersionUID = 1934771670274345290L; static final String NAME = "positiveAttributeFilter"; private final List in; @@ -57,4 +60,17 @@ public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { public String toString() { return GoodDataToStringBuilder.defaultToString(this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PositiveAttributeFilter that = (PositiveAttributeFilter) o; + return super.equals(that) && Objects.equals(in, that.in); + } + + @Override + public int hashCode() { + return Objects.hash(in, super.hashCode()); + } } diff --git a/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java b/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java index ae5eb9f8c..cf8b1f6fa 100644 --- a/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java @@ -12,15 +12,20 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; +import java.util.Objects; + import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.util.Validate.notNull; + /** * Represents {@link DateFilter} specifying relative range of given granularity. */ @JsonRootName(RelativeDateFilter.NAME) public class RelativeDateFilter extends DateFilter { + + private static final long serialVersionUID = 7257627800833737063L; static final String NAME = "relativeDateFilter"; + private final String granularity; private final Integer from; private final Integer to; @@ -38,8 +43,8 @@ public RelativeDateFilter(@JsonProperty("dataSet") final ObjQualifier dataSet, @JsonProperty("from") final Integer from, @JsonProperty("to") final Integer to) { super(dataSet); this.granularity = notEmpty(granularity, "granularity"); - this.from = notNull(from, "from"); - this.to = notNull(to, "to"); + this.from = from; + this.to = to; } public String getGranularity() { @@ -59,6 +64,21 @@ public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { return new RelativeDateFilter(qualifier, granularity, from, to); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RelativeDateFilter that = (RelativeDateFilter) o; + return super.equals(that) && Objects.equals(granularity, that.granularity) && + Objects.equals(from, that.from) && + Objects.equals(to, that.to); + } + + @Override + public int hashCode() { + return Objects.hash(granularity, from, to, super.hashCode()); + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java index 5d1e17415..219be64e2 100644 --- a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java @@ -13,8 +13,10 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import static com.gooddata.executeafm.afm.SimpleMeasureDefinition.NAME; import static com.gooddata.util.Validate.notNull; @@ -25,8 +27,9 @@ */ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonRootName(NAME) -public class SimpleMeasureDefinition implements MeasureDefinition { +public class SimpleMeasureDefinition implements MeasureDefinition, Serializable { + private static final long serialVersionUID = -385490772711914776L; static final String NAME = "measure"; private final ObjQualifier item; diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index 17b261452..62f036f99 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -9,6 +9,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; +import com.gooddata.md.visualization.VisualizationClass; +import com.gooddata.md.visualization.VisualizationObject; import org.springframework.web.util.UriTemplate; /** @@ -30,6 +32,8 @@ @JsonSubTypes.Type(ScheduledMail.class), @JsonSubTypes.Type(Table.class), @JsonSubTypes.Type(TableDataLoad.class), + @JsonSubTypes.Type(VisualizationObject.class), + @JsonSubTypes.Type(VisualizationClass.class), }) public interface Obj { diff --git a/src/main/java/com/gooddata/md/visualization/Bucket.java b/src/main/java/com/gooddata/md/visualization/Bucket.java new file mode 100644 index 000000000..4367a4397 --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/Bucket.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.executeafm.afm.LocallyIdentifiable; + +import java.io.Serializable; +import java.util.List; +import java.util.Objects; + +/** + * Represents bucket within {@link VisualizationObject} + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Bucket implements Serializable, LocallyIdentifiable { + + private static final long serialVersionUID = -7718720886547680021L; + private final String localIdentifier; + private final List items; + + /** + * Creates new instance of bucket + * @param localIdentifier local identifier of bucket + * @param items list of {@link BucketItem}s for this bucket + */ + @JsonCreator + public Bucket(@JsonProperty("localIdentifier") final String localIdentifier, + @JsonProperty("items") final List items) { + this.localIdentifier = localIdentifier; + this.items = items; + } + + /** + * @return local identifier + */ + public String getLocalIdentifier() { + return localIdentifier; + } + + /** + * @return list of {@link BucketItem}s + */ + public List getItems() { + return items; + } + + @JsonIgnore + VisualizationAttribute getOnlyAttribute() { + if (getItems() != null && getItems().size() == 1) { + final BucketItem item = getItems().iterator().next(); + if (item instanceof VisualizationAttribute) { + return (VisualizationAttribute) item; + } + } + + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Bucket bucket = (Bucket) o; + return Objects.equals(localIdentifier, bucket.localIdentifier) && + Objects.equals(items, bucket.items); + } + + @Override + public int hashCode() { + return Objects.hash(localIdentifier, items); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/BucketItem.java b/src/main/java/com/gooddata/md/visualization/BucketItem.java new file mode 100644 index 000000000..e4327474c --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/BucketItem.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * Interface for bucket items within {@link Bucket} + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Measure.class, name = Measure.NAME), + @JsonSubTypes.Type(value = VisualizationAttribute.class, name = VisualizationAttribute.NAME) +}) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public interface BucketItem {} + diff --git a/src/main/java/com/gooddata/md/visualization/CollectionType.java b/src/main/java/com/gooddata/md/visualization/CollectionType.java new file mode 100644 index 000000000..d50f8dcb9 --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/CollectionType.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +/** + * Represents type of collection that can be used as local identifier for {@link Bucket} + */ +public enum CollectionType { + SEGMENT, + STACK, + TREND, + VIEW; + + boolean isValueOf(final String type) { + return name().toLowerCase().equals(type.toLowerCase()); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/Measure.java b/src/main/java/com/gooddata/md/visualization/Measure.java new file mode 100644 index 000000000..55181f786 --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/Measure.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.executeafm.afm.MeasureDefinition; +import com.gooddata.executeafm.afm.MeasureItem; +import com.gooddata.executeafm.afm.PopMeasureDefinition; + +import java.util.Objects; + +/** + * Represents measure item within {@link Bucket} + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Measure extends MeasureItem implements BucketItem { + + private static final long serialVersionUID = -6311373783004640731L; + static final String NAME = "measure"; + + private String title; + + /** + * Creates new instance of measure for use in {@link VisualizationObject} + * @param definition measure definition + * @param localIdentifier local identifier + * @param alias alias for measure title + * @param title default name given to measure + * @param format format of measure to be computed + */ + @JsonCreator + public Measure(@JsonProperty("definition") final MeasureDefinition definition, + @JsonProperty("localIdentifier") final String localIdentifier, + @JsonProperty("alias") final String alias, + @JsonProperty("title") final String title, + @JsonProperty("format") final String format) { + super(definition, localIdentifier, alias, format); + this.title = title; + } + + /** + * @return true if measure definition has compute ratio set to true, false otherwise + */ + @JsonIgnore + public boolean hasComputeRatio() { + return getDefinition() instanceof VOSimpleMeasureDefinition && ((VOSimpleMeasureDefinition) getDefinition()).hasComputeRatio(); + } + + /** + * @return title of measure + */ + public String getTitle() { + return title; + } + + /** + * @param title of measure + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * @return true if measure contains {@link VOPopMeasureDefinition}, false otherwise + */ + @JsonIgnore + public boolean isPop() { + return getDefinition() instanceof VOPopMeasureDefinition; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Measure measure = (Measure) o; + return super.equals(measure); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java b/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java new file mode 100644 index 000000000..4deb73672 --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.executeafm.ObjQualifier; + +import static com.gooddata.md.visualization.VOPopMeasureDefinition.NAME; + +/** + * Period over Period measure definition to be used within {@link Measure} + * @deprecated identical with {@link com.gooddata.executeafm.afm.PopMeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 + */ +@Deprecated +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonRootName(NAME) +public class VOPopMeasureDefinition extends com.gooddata.executeafm.afm.PopMeasureDefinition { + + private static final long serialVersionUID = -2727004914980057124L; + public static final String NAME = "popMeasureDefinition"; + + /** + * Creates instance of Period over Period measure definition to be used in {@link VisualizationObject} + * @param measureIdentifier reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated + * @param popAttribute uri to attribute used for PoP + */ + @JsonCreator + public VOPopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier, + @JsonProperty("popAttribute") final ObjQualifier popAttribute) { + super(measureIdentifier, popAttribute); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java b/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java new file mode 100644 index 000000000..520ac6c40 --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.afm.FilterItem; + +import java.util.List; + +import static com.gooddata.md.visualization.VOSimpleMeasureDefinition.NAME; + +/** + * Simple measure definition to be used within {@link Measure} + * @deprecated identical with {@link com.gooddata.executeafm.afm.MeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 + */ +@Deprecated +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonRootName(NAME) +public class VOSimpleMeasureDefinition extends com.gooddata.executeafm.afm.SimpleMeasureDefinition { + + private static final long serialVersionUID = 8467311354259963694L; + public static final String NAME = "measureDefinition"; + + /** + * Creates instance of simple measure definition to be used in {@link VisualizationObject} + * @param item uri to measure + * @param aggregation used aggregation function + * @param computeRatio indicates if result should be calculated in percents + * @param filters filters by which measure is filtered + */ + @JsonCreator + public VOSimpleMeasureDefinition(@JsonProperty("item") final ObjQualifier item, + @JsonProperty("aggregation") final String aggregation, + @JsonProperty("computeRatio") final Boolean computeRatio, + @JsonProperty("filters") final List filters) { + super(item, aggregation, computeRatio, filters); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java b/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java new file mode 100644 index 000000000..2195c782e --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.afm.AttributeItem; + +import java.util.Objects; + +import static org.apache.commons.lang3.Validate.notNull; + +/** + * Represents attribute item withing {@link Bucket} + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class VisualizationAttribute extends AttributeItem implements BucketItem { + + private static final long serialVersionUID = -5144496152695494774L; + static final String NAME = "visualizationAttribute"; + + /** + * Creates new instance of visualization attribute for use in {@link Bucket} + * + * @param displayForm display form of attribute + * @param localIdentifier local identifier of attribute + * @param alias alias of attribute + */ + @JsonCreator + public VisualizationAttribute(@JsonProperty("displayForm") final ObjQualifier displayForm, + @JsonProperty("localIdentifier") final String localIdentifier, + @JsonProperty("alias") final String alias) { + super(displayForm, localIdentifier, alias); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + VisualizationAttribute attribute = (VisualizationAttribute) o; + return super.equals(attribute); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationClass.java b/src/main/java/com/gooddata/md/visualization/VisualizationClass.java new file mode 100644 index 000000000..62b2121ec --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VisualizationClass.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.md.AbstractObj; +import com.gooddata.md.Meta; +import com.gooddata.md.Queryable; +import com.gooddata.md.Updatable; + +import java.io.Serializable; + +import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT; +import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; +import static org.apache.commons.lang3.Validate.notNull; + +/** + * Class for holding information about visualization, including uri to its implementation, icons, order index and checksum + */ +@JsonTypeName(VisualizationClass.NAME) +@JsonTypeInfo(include = WRAPPER_OBJECT, use = NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class VisualizationClass extends AbstractObj implements Queryable, Updatable { + + private static final long serialVersionUID = -72785788784079208L; + static final String NAME = "visualizationClass"; + + private Content content; + + private VisualizationClass(@JsonProperty("content") final Content content, @JsonProperty("meta") final Meta meta ) { + super(meta); + this.content = notNull(content); + } + + /** + * @return default icon for visualization, for local visualizations in form of 'local:{@link VisualizationType}' + */ + @JsonIgnore + public String getIcon() { + return getContent().getIcon(); + } + + /** + * @return icon displayed on mouse over, for local visualizations in form of 'local:{@link VisualizationType}.selected' + */ + @JsonIgnore + public String getIconSelected() { + return getContent().getIconSelected(); + } + + /** + * @return checksum of visualization class, 'local' for local visualizations + */ + @JsonIgnore + public String getChecksum() { + return getContent().getChecksum(); + } + + /** + * @return absolute position of icon in list + */ + @JsonIgnore + public Float getOrderIndex() { + return getContent().getOrderIndex(); + } + + /** + * @return uri to implementation of visualization, for local visualizations in form of 'local:{@link VisualizationType}' + */ + @JsonIgnore + public String getUrl() { + return getContent().getUrl(); + } + + /** + * @return type of visualization, table by default + */ + @JsonIgnore + public VisualizationType getVisualizationType() { + VisualizationType visualizationType = VisualizationType.TABLE; + + String uriParts[] = getContent().getUrl().split(":"); + + if (uriParts.length > 0 && isLocal()) { + String derivedType = uriParts[uriParts.length-1]; + + visualizationType = VisualizationType.of(derivedType); + } + + return visualizationType; + } + + @JsonIgnore + private boolean isLocal() { + return getContent().getChecksum().equals("local"); + } + + private Content getContent() { + return content; + } + + private static class Content implements Serializable { + private final String url; + private final String icon; + private final String iconSelected; + private final String checksum; + private final Float orderIndex; + + @JsonCreator + private Content(@JsonProperty("url") String url, + @JsonProperty("icon") String icon, + @JsonProperty("iconSelected") String iconSelected, + @JsonProperty("checksum") String checksum, + @JsonProperty("orderIndex") Float orderIndex) { + this.url = notNull(url); + this.icon = notNull(icon); + this.iconSelected = notNull(iconSelected); + this.checksum = notNull(checksum); + this.orderIndex = orderIndex; + } + + public String getUrl() { + return url; + } + + public String getIcon() { + return icon; + } + + public String getIconSelected() { + return iconSelected; + } + + public String getChecksum() { + return checksum; + } + + public Float getOrderIndex() { + return orderIndex; + } + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java new file mode 100644 index 000000000..51fa700ae --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java @@ -0,0 +1,324 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT; +import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; +import static com.gooddata.md.visualization.CollectionType.*; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.Validate.notNull; + +import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.executeafm.afm.FilterItem; +import com.gooddata.md.AbstractObj; +import com.gooddata.md.Meta; +import com.gooddata.md.Queryable; +import com.gooddata.md.Updatable; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Stores complete information about new visualization object that can be stored as MD to md server + */ +@JsonTypeName(VisualizationObject.NAME) +@JsonTypeInfo(include = WRAPPER_OBJECT, use = NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class VisualizationObject extends AbstractObj implements Queryable, Updatable { + static final String NAME = "visualizationObject"; + private Content content; + + @JsonCreator + private VisualizationObject(@JsonProperty("content") final Content content, @JsonProperty("meta") final Meta meta) { + super(meta); + this.content = notNull(content); + } + + /** + * @return all measures from all buckets in visualization object + */ + @JsonIgnore + public List getMeasures() { + return getContent().getMeasures(); + } + + /** + * @return all measures from all buckets whose measure definition is instance of {@link VOSimpleMeasureDefinition} + */ + @JsonIgnore + public List getSimpleMeasures() { + return getMeasures().stream() + .filter(measure -> measure.getDefinition() instanceof VOSimpleMeasureDefinition) + .collect(toList()); + } + + /** + * @return all attributes from all buckets in visualization object + */ + @JsonIgnore + public List getAttributes() { + return getContent().getAttributes(); + } + + /** + * Returns attribute from collection bucket, if and only if bucket contains exactly one item of type + * {@link VisualizationAttribute}, null otherwise + * @param type of collection which we want to get, stored as local identifier in each bucket + * @return attribute from collection bucket + */ + @JsonIgnore + public VisualizationAttribute getAttributeFromCollection(final CollectionType type) { + return getContent().getBuckets().stream() + .filter(bucket -> type.isValueOf(bucket.getLocalIdentifier())) + .findFirst() + .map(Bucket::getOnlyAttribute) + .orElse(null); + } + + /** + * @return true if visualization object contains at leas one PoP measure or measure with compute ratio, false otherwise + */ + @JsonIgnore + public boolean hasDerivedMeasure() { + return getMeasures().stream().anyMatch(measure -> measure.isPop() || measure.hasComputeRatio()); + } + + /** + * Method to get uri to requested local identifier from reference items + * @param id of item + * @return uri of requested item + */ + @JsonIgnore + public String getItemById(String id) { + Map referenceItems = getReferenceItems(); + if (referenceItems != null) { + return referenceItems.get(id); + } + + return null; + } + + /** + * @return attribute from stack collection + */ + @JsonIgnore + public VisualizationAttribute getStack() { + return getAttributeFromCollection(STACK); + } + + /** + * @return attribute from view collection + */ + @JsonIgnore + public VisualizationAttribute getView() { + return getAttributeFromCollection(VIEW); + } + + /** + * @return attribute from segment collection + */ + @JsonIgnore + public VisualizationAttribute getSegment() { + return getAttributeFromCollection(SEGMENT); + } + + /** + * @return attribute from trend collection + */ + @JsonIgnore + public VisualizationAttribute getTrend() { + return getAttributeFromCollection(TREND); + } + + /** + * @return uri to visualization class + */ + @JsonIgnore + public String getVisualizationClassUri() { + return getContent().getVisualizationClassUri(); + } + + /** + * @return buckets from visualization object + */ + @JsonIgnore + public List getBuckets() { + return getContent().getBuckets(); + } + + /** + * @param buckets replacing previous visualization object's buckets + */ + @JsonIgnore + public void setBuckets(List buckets) { + content.setBuckets(buckets); + } + + /** + * @return filters from visualization object + */ + @JsonIgnore + public List getFilters() { + return getContent().getFilters(); + } + + /** + * @param filters replacing previsous visualization object's filters + */ + @JsonIgnore + public void setFilters(List filters) { + content.setFilters(filters); + } + + /** + * @return json properties of visualization object in form of string + */ + @JsonIgnore + public String getProperties() { + return getContent().getProperties(); + } + + /** + * @param properties to be set to visualization object in form of stringified json + */ + @JsonIgnore + public void setProperties(String properties) { + content.setProperties(properties); + } + + /** + * @return hash map of references in form localIdentifier:uri + */ + @JsonIgnore + public Map getReferenceItems() { + return getContent().getReferenceItems(); + } + + /** + * @param referenceItems is a hash map of references in form localIdentifier:uri to be set to visualization object + */ + @JsonIgnore + public void setReferenceItems(Map referenceItems) { + content.setReferenceItems(referenceItems); + } + + /** + * @return uri to visualizaton class wrapped as {@link UriObjQualifier} + */ + public UriObjQualifier getVisualizationClass() { + return content.getVisualizationClass(); + } + + /** + * @param uri to replace previous visualization class's uri, wrapped as {@link UriObjQualifier} + */ + public void setVisualizationClass(UriObjQualifier uri) { + content.setVisualizationClass(uri); + } + + private Content getContent() { + return content; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + private static class Content implements Serializable { + + private static final long serialVersionUID = 2895359822118041504L; + private UriObjQualifier visualizationClass; + private List buckets; + private List filters; + private String properties; + private Map referenceItems; + + @JsonCreator + private Content(@JsonProperty("visualizationClass") final UriObjQualifier visualizationClass, + @JsonProperty("buckets") final List buckets, + @JsonProperty("filters") final List filters, + @JsonProperty("properties") final String properties, + @JsonProperty("references") final Map referenceItems) { + + this.visualizationClass = notNull(visualizationClass); + this.buckets = notNull(buckets); + this.filters = filters; + this.properties = properties; + this.referenceItems = referenceItems; + } + + public List getBuckets() { + return buckets; + } + + @JsonIgnore + public List getAttributes() { + return buckets.stream() + .flatMap(bucket -> bucket.getItems().stream()) + .filter(VisualizationAttribute.class::isInstance) + .map(VisualizationAttribute.class::cast) + .collect(toList()); + } + + public void setVisualizationClass(UriObjQualifier visualizationClass) { + this.visualizationClass = visualizationClass; + } + + public void setBuckets(List buckets) { + this.buckets = buckets; + } + + public void setFilters(List filters) { + this.filters = filters; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public void setReferenceItems(Map referenceItems) { + this.referenceItems = referenceItems; + } + + @JsonIgnore + public List getMeasures() { + return buckets.stream() + .flatMap(bucket -> bucket.getItems().stream()) + .filter(Measure.class::isInstance) + .map(Measure.class::cast) + .collect(toList()); + } + + @JsonIgnore + public String getVisualizationClassUri() { + return visualizationClass.getUri(); + } + + public List getFilters() { + return filters; + } + + public String getProperties() { + return properties; + } + + public UriObjQualifier getVisualizationClass() { + return visualizationClass; + } + + public Map getReferenceItems() { + return referenceItems; + } + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationType.java b/src/main/java/com/gooddata/md/visualization/VisualizationType.java new file mode 100644 index 000000000..c3829b740 --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VisualizationType.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import org.springframework.util.StringUtils; + +import static com.gooddata.util.Validate.notNull; +import static java.lang.String.format; + +/** + * Represents supported types of currently used visualizations + */ +public enum VisualizationType { + TABLE, + LINE, + COLUMN, + BAR, + PIE; + + public static VisualizationType of(final String type) { + try { + return VisualizationType.valueOf(notNull(type, "type").toUpperCase()); + } catch (IllegalArgumentException e) { + throw new UnsupportedOperationException( + format("Unknown visualization type: \"%s\", supported types are: [%s]", + type, StringUtils.arrayToCommaDelimitedString(VisualizationType.values())), + e); + } + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/IdentifierObjQualifierTest.groovy b/src/test/groovy/com/gooddata/executeafm/IdentifierObjQualifierTest.groovy index c84fde9fb..647195bb6 100644 --- a/src/test/groovy/com/gooddata/executeafm/IdentifierObjQualifierTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/IdentifierObjQualifierTest.groovy @@ -6,6 +6,7 @@ package com.gooddata.executeafm import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -35,4 +36,12 @@ class IdentifierObjQualifierTest extends Specification { expect: EqualsVerifier.forClass(IdentifierObjQualifier).verify() } + + def "test serializable"() { + IdentifierObjQualifier qualifier = readObjectFromResource("/$QUALIFIER_JSON", IdentifierObjQualifier) + IdentifierObjQualifier deserialized = SerializationUtils.roundtrip(qualifier) + + expect: + that deserialized, jsonEquals(qualifier) + } } diff --git a/src/test/groovy/com/gooddata/executeafm/UriObjQualifierTest.groovy b/src/test/groovy/com/gooddata/executeafm/UriObjQualifierTest.groovy index ada7b3de9..043c42c70 100644 --- a/src/test/groovy/com/gooddata/executeafm/UriObjQualifierTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/UriObjQualifierTest.groovy @@ -6,6 +6,7 @@ package com.gooddata.executeafm import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -34,4 +35,12 @@ class UriObjQualifierTest extends Specification { expect: EqualsVerifier.forClass(UriObjQualifier).verify() } + + def "test serializable"() { + UriObjQualifier uriObjQualifier = readObjectFromResource("/$QUALIFIER_JSON", UriObjQualifier) + UriObjQualifier deserialized = SerializationUtils.roundtrip(uriObjQualifier) + + expect: + that deserialized, jsonEquals(uriObjQualifier) + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/AbsoluteDateFilterTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/AbsoluteDateFilterTest.groovy index 54104d9d1..a4008410d 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/AbsoluteDateFilterTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/AbsoluteDateFilterTest.groovy @@ -7,6 +7,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import org.joda.time.LocalDate import spock.lang.Specification @@ -52,4 +54,16 @@ class AbsoluteDateFilterTest extends Specification { copy.getObjQualifier().getUri() == "uri" } + def "test serializable"() { + AbsoluteDateFilter dateFilter = readObjectFromResource("/$ABSOLUTE_DATE_FILTER_JSON", AbsoluteDateFilter) + AbsoluteDateFilter deserialized = SerializationUtils.roundtrip(dateFilter) + + expect: + that deserialized, jsonEquals(dateFilter) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(AbsoluteDateFilter).usingGetClass().verify() + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/AttributeItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/AttributeItemTest.groovy index 17b343045..679c2c7a6 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/AttributeItemTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/AttributeItemTest.groovy @@ -7,6 +7,7 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier import spock.lang.Specification import spock.lang.Unroll @@ -60,4 +61,11 @@ class AttributeItemTest extends Specification { then: item.alias == "alias" } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(AttributeItem).usingGetClass() + .withIgnoredFields("alias") + .verify() + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/MeasureItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/MeasureItemTest.groovy index 4169730f0..5c1c85d3b 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/MeasureItemTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/MeasureItemTest.groovy @@ -6,6 +6,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -68,4 +70,20 @@ class MeasureItemTest extends Specification { measureItem.format == 'format' measureItem.toString() } + + def "test serializable"() { + MeasureItem measureItem = readObjectFromResource("/$MEASURE_ITEM_FULL_JSON", MeasureItem) + MeasureItem deserialized = SerializationUtils.roundtrip(measureItem) + + expect: + that deserialized, jsonEquals(measureItem) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(MeasureItem).usingGetClass() + .withIgnoredFields("alias") + .withIgnoredFields("format") + .verify() + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/NegativeAttributeFilterTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/NegativeAttributeFilterTest.groovy index dcf6c0a7d..82241c44a 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/NegativeAttributeFilterTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/NegativeAttributeFilterTest.groovy @@ -8,6 +8,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.ObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -47,4 +49,17 @@ class NegativeAttributeFilterTest extends Specification { then: copy.getObjQualifier().getUri() == "uri" } + + def "test serializable"() { + NegativeAttributeFilter attributeFilter = readObjectFromResource("/$NEGATIVE_ATTRIBUTE_FILTER_JSON", NegativeAttributeFilter) + NegativeAttributeFilter deserialized = SerializationUtils.roundtrip(attributeFilter) + + expect: + that deserialized, jsonEquals(attributeFilter) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(NegativeAttributeFilter).usingGetClass().verify() + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy index bd177982d..c7a612730 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy @@ -7,6 +7,7 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -43,4 +44,12 @@ class PopMeasureDefinitionTest extends Specification { then: copy.objQualifier.uri == 'uri' } + + def "test serializable"() { + PopMeasureDefinition measureDefinition = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition) + PopMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) + + expect: + that deserialized, jsonEquals(measureDefinition) + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PositiveAttributeFilterTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PositiveAttributeFilterTest.groovy index fe9bb88a5..1e2e3d552 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/PositiveAttributeFilterTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/PositiveAttributeFilterTest.groovy @@ -8,6 +8,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.ObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -47,4 +49,17 @@ class PositiveAttributeFilterTest extends Specification { then: copy.getObjQualifier().getUri() == "uri" } + + def "test serializable"() { + PositiveAttributeFilter attributeFilter = readObjectFromResource("/$POSITIVE_ATTRIBUTE_FILTER_JSON", PositiveAttributeFilter) + PositiveAttributeFilter deserialized = SerializationUtils.roundtrip(attributeFilter) + + expect: + that deserialized, jsonEquals(attributeFilter) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(PositiveAttributeFilter).usingGetClass().verify() + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/RelativeDateFilterTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/RelativeDateFilterTest.groovy index 28b63402f..e9131bc0c 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/RelativeDateFilterTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/RelativeDateFilterTest.groovy @@ -7,6 +7,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -47,4 +49,17 @@ class RelativeDateFilterTest extends Specification { then: copy.getObjQualifier().getUri() == "uri" } + + def "test serializable"() { + RelativeDateFilter dateFilter = readObjectFromResource("/$RELATIVE_DATE_FILTER_JSON", RelativeDateFilter) + RelativeDateFilter deserialized = SerializationUtils.roundtrip(dateFilter) + + expect: + that deserialized, jsonEquals(dateFilter) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(RelativeDateFilter).usingGetClass().verify() + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy index e5c303f76..7949e9030 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy @@ -7,6 +7,7 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -102,4 +103,12 @@ class SimpleMeasureDefinitionTest extends Specification { copy.getUri() == 'uri' copy.getObjQualifier().getUri() == 'uri' } + + def "test serializable"() { + SimpleMeasureDefinition measureDefinition = readObjectFromResource("/$SIMPLE_MEASURE_DEFINITION_FULL_JSON", SimpleMeasureDefinition) + SimpleMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) + + expect: + that deserialized, jsonEquals(measureDefinition) + } } diff --git a/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy b/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy new file mode 100644 index 000000000..c57b1bd88 --- /dev/null +++ b/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization + +import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import nl.jqno.equalsverifier.Warning +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Shared +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class BucketTest extends Specification { + private static final String NO_ITEMS_BUCKET = "md/visualization/noItemsBucket.json" + private static final String MIXED_BUCKET = "md/visualization/mixedBucket.json" + private static final String ATTRIBUTE_BUCKET = "md/visualization/attributeBucket.json" + private static final String MEASURE_BUCKET = "md/visualization/measureBucket.json" + private static final String MULTIPLE_ATTRIBUTES_BUCKET = "md/visualization/multipleAttributesBucket.json" + + @Shared + Bucket mixedBucket = readObjectFromResource("/$MIXED_BUCKET", Bucket) + + def "should serialize empty"() { + Bucket noItemsBucket = readObjectFromResource("/$NO_ITEMS_BUCKET", Bucket) + + expect: + that new Bucket("noItems", new ArrayList()), jsonEquals(noItemsBucket) + } + + def "should serialize full"() { + expect: + that new Bucket("attributeBucket", [ + new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm"), "attribute", "Attribute Alias"), + new Measure( + new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure"), "sum", false, []), + "measure", + "Measure Alias", + "Measure", + null + ) + ]), jsonEquals(mixedBucket) + } + + def "should return only attribute from bucket"() { + Bucket bucket = readObjectFromResource("/$resource", Bucket) + BucketItem bucketItem = index == null ? null : bucket.getItems().get(index) + + expect: + that bucket.getOnlyAttribute(), jsonEquals(bucketItem) + + where: + // exactly one attributeItem in bucket is required + resource | index + NO_ITEMS_BUCKET | null + ATTRIBUTE_BUCKET | 0 + MEASURE_BUCKET | null + MULTIPLE_ATTRIBUTES_BUCKET | null + } + + def "test serializable"() { + Bucket deserialized = SerializationUtils.roundtrip(mixedBucket) + + expect: + that deserialized, jsonEquals(mixedBucket) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(Bucket).usingGetClass().verify() + } +} diff --git a/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy b/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy new file mode 100644 index 000000000..7d2b69797 --- /dev/null +++ b/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization + +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Shared +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static spock.util.matcher.HamcrestSupport.that + +class MeasureTest extends Specification { + private static final String MULTIPLE_MEASURES_BUCKET = "md/visualization/multipleMeasuresBucket.json" + private static final String MEASURE_BUCKET = "md/visualization/measureBucket.json" + + @Shared + Bucket bucket = readObjectFromResource("/$MULTIPLE_MEASURES_BUCKET", Bucket) + @Shared + Measure measureWithCr = bucket.getItems().get(0) + @Shared + Measure measureWithoutCr = bucket.getItems().get(1) + @Shared + Measure popMeasure = bucket.getItems().get(2) + + def "should check if is pop measure"() { + expect: + popMeasure.isPop() + + and: + !measureWithCr.isPop() + !measureWithoutCr.isPop() + } + + def "should check if has compute ratio"() { + expect: + measureWithCr.hasComputeRatio() + + and: + !measureWithoutCr.hasComputeRatio() + !popMeasure.hasComputeRatio() + } + + def "should set title"() { + Bucket measureBucket = readObjectFromResource("/$MEASURE_BUCKET", Bucket) + Measure measure = measureBucket.getItems().get(0) + + when: + measure.setTitle("new title") + + then: + measure.getTitle() == "new title" + } + + def "test serializable"() { + Measure deserialized = SerializationUtils.roundtrip(measureWithCr) + + expect: + that deserialized, jsonEquals(measureWithCr) + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(Measure).usingGetClass() + .withIgnoredFields("alias") + .withIgnoredFields("title") + .withIgnoredFields("format") + .verify() + } +} diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationClassTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationClassTest.groovy new file mode 100644 index 000000000..dab236430 --- /dev/null +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationClassTest.groovy @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization + +import com.gooddata.md.Meta +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Shared +import spock.lang.Specification +import spock.lang.Unroll + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static spock.util.matcher.HamcrestSupport.that + +class VisualizationClassTest extends Specification { + private static final String TABLE_VISUALIZATION_CLASS = '/md/visualization/tableVisualizationClass.json' + private static final String BAR_VISUALIZATION_CLASS = '/md/visualization/barVisualizationClass.json' + private static final String EXTERNAL_VISUALIZATION_CLASS = '/md/visualization/externalVisualizationClass.json' + + @Shared + VisualizationClass tableVisualizationClass = readObjectFromResource(TABLE_VISUALIZATION_CLASS, VisualizationClass) + + def "should serialize full"() { + VisualizationClass external = readObjectFromResource(EXTERNAL_VISUALIZATION_CLASS, VisualizationClass) + + expect: + that new VisualizationClass( + new VisualizationClass.Content("local:table", "icon", "iconSelected", "checksum", 0), + new Meta("visClass") + ), + jsonEquals(tableVisualizationClass) + + and: + that new VisualizationClass( + new VisualizationClass.Content("https://some.vis", "icon", "iconSelected", "checksum", 0), + new Meta("external") + ), + jsonEquals(external) + } + + def "should check if visualization is local"() { + VisualizationClass visualizationClass = readObjectFromResource(resource, VisualizationClass) + + expect: + visualizationClass.isLocal() == expected + + where: + resource | expected + EXTERNAL_VISUALIZATION_CLASS | false + TABLE_VISUALIZATION_CLASS | true + } + + def "should return correct visualization type"() { + VisualizationClass visualizationClass = readObjectFromResource(resource, VisualizationClass) + + expect: + visualizationClass.getVisualizationType() == expected + + where: + resource | expected + EXTERNAL_VISUALIZATION_CLASS | VisualizationType.TABLE + TABLE_VISUALIZATION_CLASS | VisualizationType.TABLE + BAR_VISUALIZATION_CLASS | VisualizationType.BAR + } + + def "test serializable"() { + VisualizationClass deserialized = SerializationUtils.roundtrip(tableVisualizationClass) + + expect: + that deserialized, jsonEquals(tableVisualizationClass) + } +} diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy new file mode 100644 index 000000000..beb03be17 --- /dev/null +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.md.visualization + +import com.fasterxml.jackson.databind.ObjectMapper +import com.gooddata.executeafm.UriObjQualifier +import com.gooddata.executeafm.afm.AbsoluteDateFilter +import com.gooddata.executeafm.afm.NegativeAttributeFilter +import com.gooddata.executeafm.afm.PositiveAttributeFilter +import com.gooddata.executeafm.afm.RelativeDateFilter +import com.gooddata.md.Meta +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils +import org.joda.time.LocalDate +import spock.lang.Shared +import spock.lang.Specification +import spock.lang.Unroll + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static spock.util.matcher.HamcrestSupport.that + +class VisualizationObjectTest extends Specification { + private static final String COMPLEX_VISUALIZATION = "md/visualization/complexVisualizationObject.json" + private static final String SIMPLE_VISUALIZATION = "md/visualization/simpleVisualizationObject.json" + private static final String STACKED_COLUMN_CHART = "md/visualization/stackedColumnChart.json" + private static final String SEGMENTED_LINE_CHART = "md/visualization/segmentedLineChart.json" + private static final String CUSTOM_CHART = "md/visualization/customChart.json" + private static final String EMPTY_BUCKETS = "md/visualization/emptyBucketsVisualization.json" + private static final String MULTIPLE_MEASURE_BUCKETS = "md/visualization/multipleMeasureBucketsVisualization.json" + + @Shared + VisualizationObject stackedColumnChart = readObjectFromResource("/$STACKED_COLUMN_CHART", VisualizationObject) + @Shared + VisualizationObject segmentedLineChart = readObjectFromResource("/$SEGMENTED_LINE_CHART", VisualizationObject) + @Shared + VisualizationObject emptyBucketsVisualization = readObjectFromResource("/$EMPTY_BUCKETS", VisualizationObject) + @Shared + VisualizationObject complexVisualization = readObjectFromResource("/$COMPLEX_VISUALIZATION", VisualizationObject) + @Shared + VisualizationObject multipleMeasuresVisualization = readObjectFromResource("/$MULTIPLE_MEASURE_BUCKETS", VisualizationObject) + + def "should serialize full"() { + VisualizationAttribute attribute1 = new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm/1"), "attribute1", "attributeAlias") + PositiveAttributeFilter positiveAttributeFilter = new PositiveAttributeFilter( new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]) + NegativeAttributeFilter negativeAttributeFilter = new NegativeAttributeFilter( new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]) + AbsoluteDateFilter absoluteDateFilter = new AbsoluteDateFilter( new UriObjQualifier("/uri/to/dataSet/1"), new LocalDate("2000-08-30"), new LocalDate("2017-08-07")) + RelativeDateFilter relativeDateFilter = new RelativeDateFilter( new UriObjQualifier("/uri/to/dataSet/2"), "month", 0, -11) + VOSimpleMeasureDefinition measureDefinition = new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/1"), "sum", false, [positiveAttributeFilter, negativeAttributeFilter, absoluteDateFilter, relativeDateFilter ]) + Map references = new HashMap<>() + references.put("key", "value") + references.put("foo", "bar") + + expect: + that new VisualizationObject( + new VisualizationObject.Content( + new UriObjQualifier("visClass"), + [ + new Bucket("bucket1", [attribute1]), + new Bucket("bucket2", [ + new Measure( + measureDefinition, + "measure1", + "Measure 1 alias", + "Measure 1", + null + ) + ]) + ], + [ + positiveAttributeFilter, + negativeAttributeFilter, + absoluteDateFilter, + relativeDateFilter + ], + "{\"key\":\"value\"}", + references + ), + new Meta("complex") + ), jsonEquals(complexVisualization) + } + + def "should serialize"() { + VisualizationObject simpleVisualization = readObjectFromResource("/$SIMPLE_VISUALIZATION", VisualizationObject) + + expect: + that new VisualizationObject( + new VisualizationObject.Content( + new UriObjQualifier("visClass"), + [], + null, + null, + null + ), + new Meta("simple") + ), jsonEquals(simpleVisualization) + } + + def "should return null when invalid collection requested"() { + VisualizationObject customChart = readObjectFromResource("/$CUSTOM_CHART", VisualizationObject) + + when: + VisualizationAttribute fromMissingCollection = stackedColumnChart.getAttributeFromCollection(CollectionType.TREND) + VisualizationAttribute missingAttribute = customChart.getAttributeFromCollection(CollectionType.VIEW) + + then: + fromMissingCollection == null + missingAttribute == null + } + + @Unroll + def "return item in #name collection"() { + VisualizationAttribute attribute = getter() + + expect: + attribute == expected + + where: + name | getter | expected + "view" | stackedColumnChart.&getView | stackedColumnChart.getBuckets().get(0).getItems().get(0) + "stack" | stackedColumnChart.&getStack | stackedColumnChart.getBuckets().get(1).getItems().get(0) + "trend" | segmentedLineChart.&getTrend | segmentedLineChart.getBuckets().get(0).getItems().get(0) + "segment" | segmentedLineChart.&getSegment | segmentedLineChart.getBuckets().get(1).getItems().get(0) + } + + def "should return null when non-existing key requested"() { + expect: + complexVisualization.getItemById("foo") == "bar" + + and: + complexVisualization.getItemById("invalid") == null + } + + def "should return measures"() { + expect: + measures == expected + + where: + measures | expected + multipleMeasuresVisualization.getMeasures() | [ multipleMeasuresVisualization.content.buckets.get(0).getItems().get(0), + multipleMeasuresVisualization.content.buckets.get(1).getItems().get(0), + multipleMeasuresVisualization.content.buckets.get(1).getItems().get(1) ] + emptyBucketsVisualization.getMeasures() | [] + } + + def "return only simple measures"() { + expect: + measures == expected + + where: + measures | expected + multipleMeasuresVisualization.getSimpleMeasures() | [ multipleMeasuresVisualization.content.buckets.get(0).getItems().get(0), + multipleMeasuresVisualization.content.buckets.get(1).getItems().get(0) ] + emptyBucketsVisualization.getSimpleMeasures() | [] + } + + def "should return attributes"() { + expect: + attributes == expected + + where: + attributes | expected + segmentedLineChart.getAttributes() | [ segmentedLineChart.content.buckets.get(0).getItems().get(0), + segmentedLineChart.content.buckets.get(1).getItems().get(0) ] + emptyBucketsVisualization.getAttributes() | [] + } + + def "should check if visualization object has derived measures"() { + VisualizationObject visualizationWithPop = multipleMeasuresVisualization + VisualizationObject visualizationWithoutPop = segmentedLineChart + VisualizationObject noMeasuresVisualization = emptyBucketsVisualization + + expect: + visualizationWithPop.hasDerivedMeasure() + + and: + !visualizationWithoutPop.hasDerivedMeasure() + !noMeasuresVisualization.hasDerivedMeasure() + } + + @Unroll + def "should set #property"() { + VisualizationObject empty = readObjectFromResource("/$EMPTY_BUCKETS", VisualizationObject) + + when: + empty."set$property"(complexVisualization."get$property"()) + + then: + empty."get$property"() == complexVisualization."get$property"() + + where: + property << ["VisualizationClass", "Buckets", "Filters", "Properties", "ReferenceItems"] + } + + def "test serializable"() { + VisualizationObject deserialized = SerializationUtils.roundtrip(complexVisualization) + + expect: + that deserialized, jsonEquals(complexVisualization) + } +} \ No newline at end of file diff --git a/src/test/resources/md/visualization/attributeBucket.json b/src/test/resources/md/visualization/attributeBucket.json new file mode 100644 index 000000000..79c3c5efd --- /dev/null +++ b/src/test/resources/md/visualization/attributeBucket.json @@ -0,0 +1,14 @@ +{ + "localIdentifier": "attributeBucket", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "attribute", + "displayForm": { + "uri": "/uri/to/displayForm" + }, + "alias": "Attribute Alias" + } + } + ] +} diff --git a/src/test/resources/md/visualization/barVisualizationClass.json b/src/test/resources/md/visualization/barVisualizationClass.json new file mode 100644 index 000000000..42ebf6ab9 --- /dev/null +++ b/src/test/resources/md/visualization/barVisualizationClass.json @@ -0,0 +1,14 @@ +{ + "visualizationClass": { + "content": { + "url": "local:bar", + "icon": "icon", + "iconSelected": "iconSelected", + "checksum": "local", + "orderIndex": 0 + }, + "meta": { + "name": "some name" + } + } +} diff --git a/src/test/resources/md/visualization/complexVisualizationObject.json b/src/test/resources/md/visualization/complexVisualizationObject.json new file mode 100644 index 000000000..8ce0ba530 --- /dev/null +++ b/src/test/resources/md/visualization/complexVisualizationObject.json @@ -0,0 +1,130 @@ +{ + "visualizationObject": { + "meta": { + "title": "complex" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "bucket1", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "attribute1", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, { + "localIdentifier": "bucket2", + "items": [ + { + "measure": { + "localIdentifier": "measure1", + "title": "Measure 1", + "alias": "Measure 1 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/1" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [ + { + "positiveAttributeFilter": { + "displayForm": { + "uri": "/uri/to/displayForm/3" + }, + "in": [ + "ab", + "cd" + ] + } + }, { + "negativeAttributeFilter": { + "displayForm": { + "uri": "/uri/to/displayForm/3" + }, + "notIn": [ + "ab", + "cd" + ] + } + }, { + "absoluteDateFilter": { + "dataSet": { + "uri": "/uri/to/dataSet/1" + }, + "from": "2000-08-30", + "to": "2017-08-07" + } + }, { + "relativeDateFilter": { + "dataSet": { + "uri": "/uri/to/dataSet/2" + }, + "granularity": "month", + "from": 0, + "to": -11 + } + } + ] + } + } + } + } + ] + } + ], + "filters": [ + { + "positiveAttributeFilter": { + "displayForm": { + "uri": "/uri/to/displayForm/3" + }, + "in": [ + "ab", + "cd" + ] + } + }, { + "negativeAttributeFilter": { + "displayForm": { + "uri": "/uri/to/displayForm/3" + }, + "notIn": [ + "ab", + "cd" + ] + } + }, { + "absoluteDateFilter": { + "dataSet": { + "uri": "/uri/to/dataSet/1" + }, + "from": "2000-08-30", + "to": "2017-08-07" + } + }, { + "relativeDateFilter": { + "dataSet": { + "uri": "/uri/to/dataSet/2" + }, + "granularity": "month", + "from": 0, + "to": -11 + } + } + ], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value", "foo": "bar" } + } + } +} diff --git a/src/test/resources/md/visualization/customChart.json b/src/test/resources/md/visualization/customChart.json new file mode 100644 index 000000000..909077e40 --- /dev/null +++ b/src/test/resources/md/visualization/customChart.json @@ -0,0 +1,48 @@ +{ + "visualizationObject": { + "meta": { + "title": "New insight" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "view", + "items": [] + }, { + "localIdentifier": "stack", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "2", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, + { + "localIdentifier": "measure", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "2", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + } + ], + "filters": [], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value" } + } + } +} diff --git a/src/test/resources/md/visualization/emptyBucketsVisualization.json b/src/test/resources/md/visualization/emptyBucketsVisualization.json new file mode 100644 index 000000000..88b731206 --- /dev/null +++ b/src/test/resources/md/visualization/emptyBucketsVisualization.json @@ -0,0 +1,16 @@ +{ + "visualizationObject": { + "meta": { + "title": "Empty buckets" + }, + "content": { + "visualizationClass": { + "uri": "https://empty" + }, + "buckets": [], + "filters": [], + "properties": "{\"nokey\":\"novalue\"}", + "references": { "key": "novalue" } + } + } +} diff --git a/src/test/resources/md/visualization/externalVisualizationClass.json b/src/test/resources/md/visualization/externalVisualizationClass.json new file mode 100644 index 000000000..1cff73cdf --- /dev/null +++ b/src/test/resources/md/visualization/externalVisualizationClass.json @@ -0,0 +1,14 @@ +{ + "visualizationClass": { + "content": { + "url": "https://some.vis", + "icon": "icon", + "iconSelected": "iconSelected", + "checksum": "external", + "orderIndex": 0 + }, + "meta": { + "title": "external" + } + } +} diff --git a/src/test/resources/md/visualization/measureBucket.json b/src/test/resources/md/visualization/measureBucket.json new file mode 100644 index 000000000..2fca67e47 --- /dev/null +++ b/src/test/resources/md/visualization/measureBucket.json @@ -0,0 +1,22 @@ +{ + "localIdentifier": "measureBucket", + "items": [ + { + "measure": { + "localIdentifier": "measure", + "title": "Measure", + "alias": "Measure alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure" + }, + "aggregation": "sum", + "computeRatio": "false", + "filters": [] + } + } + } + } + ] +} diff --git a/src/test/resources/md/visualization/mixedBucket.json b/src/test/resources/md/visualization/mixedBucket.json new file mode 100644 index 000000000..588da7e85 --- /dev/null +++ b/src/test/resources/md/visualization/mixedBucket.json @@ -0,0 +1,30 @@ +{ + "localIdentifier": "attributeBucket", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "attribute", + "displayForm": { + "uri": "/uri/to/displayForm" + }, + "alias": "Attribute Alias" + } + }, { + "measure": { + "localIdentifier": "measure", + "title": "Measure", + "alias": "Measure Alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [] + } + } + } + } + ] +} diff --git a/src/test/resources/md/visualization/multipleAttributesBucket.json b/src/test/resources/md/visualization/multipleAttributesBucket.json new file mode 100644 index 000000000..3dbbf4746 --- /dev/null +++ b/src/test/resources/md/visualization/multipleAttributesBucket.json @@ -0,0 +1,22 @@ +{ + "localIdentifier": "multipleAttributesBucket", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "attribute1", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attribute1Alias" + } + }, { + "visualizationAttribute": { + "localIdentifier": "attribute2", + "displayForm": { + "uri": "/uri/to/displayForm/2" + }, + "alias": "attribute2Alias" + } + } + ] +} diff --git a/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json b/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json new file mode 100644 index 000000000..b89684db0 --- /dev/null +++ b/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json @@ -0,0 +1,74 @@ +{ + "visualizationObject": { + "meta": { + "title": "New insight" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "measures 1", + "items": [ + { + "measure": { + "localIdentifier": "measure1", + "title": "Measure 1", + "alias": "Measure 1 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/1" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [] + } + } + } + } + ] + }, { + "localIdentifier": "measures 2", + "items": [ + { + "measure": { + "localIdentifier": "measure2", + "title": "Measure 2", + "alias": "Measure 2 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/2" + }, + "aggregation": "avg", + "computeRatio": true, + "filters": [] + } + } + } + }, { + "measure": { + "localIdentifier": "measure2pop", + "title": "Measure 2 pop", + "alias": "Measure 2 pop alias", + "definition": { + "popMeasureDefinition": { + "measureIdentifier": "measure2", + "popAttribute": { + "uri": "/uri/to/attribute" + } + } + } + } + } + ] + } + ], + "filters": [], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value" } + } + } +} diff --git a/src/test/resources/md/visualization/multipleMeasuresBucket.json b/src/test/resources/md/visualization/multipleMeasuresBucket.json new file mode 100644 index 000000000..f4b83a4b0 --- /dev/null +++ b/src/test/resources/md/visualization/multipleMeasuresBucket.json @@ -0,0 +1,52 @@ +{ + "localIdentifier": "measures", + "items": [ + { + "measure": { + "localIdentifier": "measure1", + "title": "Measure 1", + "alias": "Measure 1 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/1" + }, + "aggregation": "avg", + "computeRatio": true, + "filters": [] + } + } + } + },{ + "measure": { + "localIdentifier": "measure2", + "title": "Measure 2", + "alias": "Measure 2 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/2" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [] + } + } + } + }, { + "measure": { + "localIdentifier": "pop measure", + "title": "Pop Measure", + "alias": "Pop Measure Alias", + "definition": { + "popMeasureDefinition": { + "measureIdentifier": "measure1", + "popAttribute": { + "uri": "/uri/to/attribute" + } + } + } + } + } + ] +} diff --git a/src/test/resources/md/visualization/noItemsBucket.json b/src/test/resources/md/visualization/noItemsBucket.json new file mode 100644 index 000000000..942ff2d8c --- /dev/null +++ b/src/test/resources/md/visualization/noItemsBucket.json @@ -0,0 +1,4 @@ +{ + "localIdentifier": "noItems", + "items": [] +} diff --git a/src/test/resources/md/visualization/segmentedLineChart.json b/src/test/resources/md/visualization/segmentedLineChart.json new file mode 100644 index 000000000..b6d763bcf --- /dev/null +++ b/src/test/resources/md/visualization/segmentedLineChart.json @@ -0,0 +1,66 @@ +{ + "visualizationObject": { + "meta": { + "title": "New insight" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "trend", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "1", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, { + "localIdentifier": "segment", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "2", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, + { + "localIdentifier": "measure", + "items": [ + { + "measure": { + "localIdentifier": "measure1", + "title": "Measure 1", + "alias": "Measure 1 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/1" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [] + } + } + } + } + ] + } + ], + "filters": [], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value" } + } + } +} diff --git a/src/test/resources/md/visualization/simpleVisualizationObject.json b/src/test/resources/md/visualization/simpleVisualizationObject.json new file mode 100644 index 000000000..5427d6f73 --- /dev/null +++ b/src/test/resources/md/visualization/simpleVisualizationObject.json @@ -0,0 +1,13 @@ +{ + "visualizationObject": { + "meta": { + "title": "simple" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [] + } + } +} diff --git a/src/test/resources/md/visualization/stackedColumnChart.json b/src/test/resources/md/visualization/stackedColumnChart.json new file mode 100644 index 000000000..89187253a --- /dev/null +++ b/src/test/resources/md/visualization/stackedColumnChart.json @@ -0,0 +1,66 @@ +{ + "visualizationObject": { + "meta": { + "title": "New insight" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "view", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "1", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, { + "localIdentifier": "stack", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "2", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, + { + "localIdentifier": "measure", + "items": [ + { + "measure": { + "localIdentifier": "measure1", + "title": "Measure 1", + "alias": "Measure 1 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/1" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [] + } + } + } + } + ] + } + ], + "filters": [], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value" } + } + } +} diff --git a/src/test/resources/md/visualization/tableVisualizationClass.json b/src/test/resources/md/visualization/tableVisualizationClass.json new file mode 100644 index 000000000..f0f1287ed --- /dev/null +++ b/src/test/resources/md/visualization/tableVisualizationClass.json @@ -0,0 +1,14 @@ +{ + "visualizationClass": { + "content": { + "url": "local:table", + "icon": "icon", + "iconSelected": "iconSelected", + "checksum": "local", + "orderIndex": 0 + }, + "meta": { + "title": "visClass" + } + } +} From 4b5b455dfeb0baa0bad5d8cfda19826c89ba736f Mon Sep 17 00:00:00 2001 From: Peter Lacko Date: Tue, 12 Dec 2017 09:22:40 +0100 Subject: [PATCH 038/548] Add VisualizationObject to Execution converter --- .../executeafm/afm/AbsoluteDateFilter.java | 7 + .../gooddata/executeafm/afm/DateFilter.java | 5 + .../afm/NegativeAttributeFilter.java | 9 + .../executeafm/afm/RelativeDateFilter.java | 7 + .../visualization/VisualizationAttribute.java | 2 - .../visualization/VisualizationConverter.java | 279 ++++++++++++++++++ .../md/visualization/VisualizationObject.java | 37 ++- .../md/visualization/BucketTest.groovy | 2 - .../VisualizationObjectConverterTest.groovy | 155 ++++++++++ .../VisualizationObjectTest.groovy | 3 - .../complexVisualizationObject.json | 18 +- .../resources/md/visualization/lineChart.json | 52 ++++ ...multipleAttributeBucketsVisualization.json | 52 ++++ 13 files changed, 606 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/gooddata/md/visualization/VisualizationConverter.java create mode 100644 src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy create mode 100644 src/test/resources/md/visualization/lineChart.json create mode 100644 src/test/resources/md/visualization/multipleAttributeBucketsVisualization.json diff --git a/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java b/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java index 24223c34c..e4e7f3493 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java @@ -6,6 +6,7 @@ package com.gooddata.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -67,6 +68,12 @@ public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { return new AbsoluteDateFilter(qualifier, from, to); } + @Override + @JsonIgnore + public boolean isAllTimeSelected() { + return getFrom() == null || getTo() == null; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java b/src/main/java/com/gooddata/executeafm/afm/DateFilter.java index 08333538a..ca545a364 100644 --- a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/DateFilter.java @@ -42,6 +42,11 @@ public ObjQualifier getObjQualifier() { return getDataSet(); } + /** + * @return true if no time period is specified, false otherwise + */ + public abstract boolean isAllTimeSelected(); + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java b/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java index dfe5c1f18..bcf5e0c80 100644 --- a/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java @@ -6,6 +6,7 @@ package com.gooddata.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; import com.gooddata.executeafm.ObjQualifier; @@ -51,6 +52,14 @@ public List getNotIn() { return notIn; } + /** + * @return true if filter contains no elements, false otherwise + */ + @JsonIgnore + public boolean isAllSelected() { + return notIn.isEmpty(); + } + @Override public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { return new NegativeAttributeFilter(qualifier, notIn); diff --git a/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java b/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java index cf8b1f6fa..ec7496558 100644 --- a/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java @@ -6,6 +6,7 @@ package com.gooddata.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; import com.gooddata.executeafm.ObjQualifier; @@ -64,6 +65,12 @@ public FilterItem withObjUriQualifier(final UriObjQualifier qualifier) { return new RelativeDateFilter(qualifier, granularity, from, to); } + @Override + @JsonIgnore + public boolean isAllTimeSelected() { + return getFrom() == null || getTo() == null; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java b/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java index 2195c782e..9bb3ae718 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java @@ -13,8 +13,6 @@ import java.util.Objects; -import static org.apache.commons.lang3.Validate.notNull; - /** * Represents attribute item withing {@link Bucket} */ diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java new file mode 100644 index 000000000..01081d08b --- /dev/null +++ b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.executeafm.Execution; +import com.gooddata.executeafm.afm.Afm; +import com.gooddata.executeafm.afm.AttributeItem; +import com.gooddata.executeafm.afm.CompatibilityFilter; +import com.gooddata.executeafm.afm.DateFilter; +import com.gooddata.executeafm.afm.FilterItem; +import com.gooddata.executeafm.afm.MeasureItem; +import com.gooddata.executeafm.afm.NegativeAttributeFilter; +import com.gooddata.executeafm.afm.PositiveAttributeFilter; +import com.gooddata.executeafm.afm.SimpleMeasureDefinition; +import com.gooddata.executeafm.resultspec.AttributeSortItem; +import com.gooddata.executeafm.resultspec.Dimension; +import com.gooddata.executeafm.resultspec.Direction; +import com.gooddata.executeafm.resultspec.MeasureLocatorItem; +import com.gooddata.executeafm.resultspec.MeasureSortItem; +import com.gooddata.executeafm.resultspec.ResultSpec; +import com.gooddata.executeafm.resultspec.SortItem; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.gooddata.executeafm.resultspec.Dimension.MEASURE_GROUP; +import static com.gooddata.md.visualization.CollectionType.SEGMENT; +import static com.gooddata.md.visualization.CollectionType.STACK; +import static com.gooddata.md.visualization.CollectionType.TREND; +import static com.gooddata.md.visualization.CollectionType.VIEW; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.Validate.notNull; + +/** + * Helper class for converting {@link VisualizationObject} into {@link Execution} + */ +public abstract class VisualizationConverter { + private static final ObjectMapper MAPPER = new ObjectMapper(); + + /** + * Generate Execution from Visualization object. Currently {@link ResultSpec}'s {@link Dimension}s can be generated + * for table and four types of chart: bar, column, line and pie. + * + * @param visualizationObject which will be converted to {@link Execution} + * @param visualizationClassGetter {@link Function} for fetching VisualizationClass, which is necessary for correct generation of {@link ResultSpec} + * @return {@link Execution} object + */ + public static Execution convertToExecution(final VisualizationObject visualizationObject, final Function visualizationClassGetter) { + VisualizationClass visualizationClass = notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri()); + + ResultSpec resultSpec = convertToResultSpec(visualizationObject, visualizationClass.getVisualizationType()); + Afm afm = convertToAfm(visualizationObject); + return new Execution(afm, resultSpec); + } + + static Afm convertToAfm(final VisualizationObject visualizationObject) { + final List attributes = convertAttributes(visualizationObject.getAttributes()); + final List filters = convertFilters(visualizationObject.getFilters()); + final List measures = convertMeasures(visualizationObject.getMeasures()); + + return new Afm(attributes, filters, measures, null); + } + + static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, + final VisualizationType visualizationType) { + notNull(visualizationObject); + notNull(visualizationType); + List sorts = getSorting(visualizationObject); + List dimensions = getDimensions(visualizationObject, visualizationType); + return new ResultSpec(dimensions, sorts); + } + + static List getSorting(final VisualizationObject visualizationObject) { + try { + List sorts = parseSorting(visualizationObject.getProperties()); + if (sorts != null) { + return sorts; + } + } catch (Exception ignored) {} + return generateDefaultSorting(visualizationObject); + } + + static List parseSorting(final String properties) throws Exception { + JsonNode jsonProperties = parseProperties(properties); + JsonNode nodeSortItems = jsonProperties.get("sortItems"); + TypeReference> mapType = new TypeReference>() {}; + return MAPPER.convertValue(nodeSortItems, mapType); + } + + private static List generateDefaultSorting(final VisualizationObject visualizationObject) { + List attributes = visualizationObject.getAttributes(); + if(!attributes.isEmpty()) { + return Collections.singletonList(new AttributeSortItem(Direction.ASC, attributes.get(0).getLocalIdentifier())); + } + + List measures = visualizationObject.getMeasures(); + if(!measures.isEmpty()) { + MeasureLocatorItem locator = new MeasureLocatorItem(measures.get(0).getLocalIdentifier()); + return Collections.singletonList(new MeasureSortItem(Direction.DESC, Collections.singletonList(locator))); + } + + return null; + } + + private static List getDimensions(final VisualizationObject visualizationObject, + final VisualizationType visualizationType) { + switch (visualizationType) { + case COLUMN: + case BAR: + return getDimensionsForStacked(visualizationObject, STACK, VIEW); + case LINE: + return getDimensionsForStacked(visualizationObject, SEGMENT, TREND); + case PIE: + return getDimensionsForPie(visualizationObject); + default: + return getDimensionsForTable(visualizationObject); + } + } + + private static List getDimensionsForPie(final VisualizationObject visualizationObject) { + VisualizationAttribute attribute = visualizationObject.getView(); + + List dimensions = new ArrayList<>(); + + if (visualizationObject.hasMeasures()) { + dimensions.add(new Dimension(MEASURE_GROUP)); + } + + if (attribute != null) { + dimensions.add(new Dimension(attribute.getLocalIdentifier())); + } + + return dimensions; + } + + private static List getDimensionsForStacked(final VisualizationObject visualizationObject, + final CollectionType stackBy, + final CollectionType viewBy) { + VisualizationAttribute stack = visualizationObject.getAttributeFromCollection(stackBy); + VisualizationAttribute view = visualizationObject.getAttributeFromCollection(viewBy); + + List dimensions = new ArrayList<>(); + + if (stack != null) { + dimensions.add(new Dimension(stack.getLocalIdentifier())); + + List dimensionItems = new ArrayList<>(); + + if (view != null) { + dimensionItems.add(view.getLocalIdentifier()); + } + + if (visualizationObject.hasMeasures()) { + dimensionItems.add(MEASURE_GROUP); + } + + if (!dimensionItems.isEmpty()) { + dimensions.add(new Dimension(dimensionItems)); + } + } else { + if (visualizationObject.hasMeasures()) { + dimensions.add(new Dimension(MEASURE_GROUP)); + } + + if (view != null) { + dimensions.add(new Dimension(view.getLocalIdentifier())); + } + } + + return dimensions; + } + + private static List getDimensionsForTable(final VisualizationObject visualizationObject) { + List dimensions = new ArrayList<>(); + + List attributes = visualizationObject.getAttributes(); + + if (!attributes.isEmpty()) { + dimensions.add(new Dimension(attributes.stream() + .map(VisualizationAttribute::getLocalIdentifier) + .collect(toList()) + )); + } else { + dimensions.add(new Dimension(new ArrayList<>())); + } + + if (visualizationObject.hasMeasures()) { + dimensions.add(new Dimension(MEASURE_GROUP)); + } + + return dimensions; + } + + private static JsonNode parseProperties(final String properties) throws Exception { + return MAPPER.readValue(properties, JsonNode.class); + } + + private static List convertAttributes(final List attributes) { + return attributes.stream() + .map(AttributeItem.class::cast) + .collect(toList()); + } + + private static List convertFilters(final List filters) { + if (filters == null) { + return new ArrayList<>(); + } + List validFilters = removeIrrelevantFilters(filters); + return getCompatibilityFilters(validFilters); + } + + private static List convertMeasures(final List measures) { + List measuresForAfm = measures.stream() + .map(VisualizationConverter::removeFormat) + .map(VisualizationConverter::getAfmMeasure) + .map(VisualizationConverter::convertMeasureFilters) + .collect(toList()); + return measuresForAfm; + } + + private static Measure removeFormat(final Measure measure) { + if (measure.hasComputeRatio()) { + measure.setFormat(""); + } + + return measure; + } + + private static MeasureItem getAfmMeasure(final Measure measure) { + String alias = measure.getAlias(); + String usedTitle = alias; + if(alias == null || alias.isEmpty()) { + if (measure.getTitle() != null) { + usedTitle = measure.getTitle(); + } + } + return new MeasureItem(measure.getDefinition(), measure.getLocalIdentifier(), usedTitle, measure.getFormat()); + } + + private static MeasureItem convertMeasureFilters(final MeasureItem measure) { + if (measure.getDefinition() instanceof SimpleMeasureDefinition) { + List filters = ((SimpleMeasureDefinition) measure.getDefinition()).getFilters(); + List validFilters = removeIrrelevantFilters(filters); + ((SimpleMeasureDefinition) measure.getDefinition()).setFilters(validFilters); + } + + return measure; + } + + + private static List getCompatibilityFilters(final List filters) { + return (List)(List) filters; + } + + private static List removeIrrelevantFilters(final List filters) { + return filters.stream() + .filter((f) -> { + if (f instanceof DateFilter) { + return !((DateFilter) f).isAllTimeSelected(); + } else if (f instanceof NegativeAttributeFilter) { + return !((NegativeAttributeFilter) f).isAllSelected(); + } else if (f instanceof PositiveAttributeFilter) { + return true; + } + + return false; + }) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java index 51fa700ae..cd3ae2b09 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java @@ -20,15 +20,17 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.executeafm.afm.FilterItem; +import com.gooddata.executeafm.Execution; import com.gooddata.md.AbstractObj; import com.gooddata.md.Meta; import com.gooddata.md.Queryable; import com.gooddata.md.Updatable; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; +import java.util.function.Function; /** * Stores complete information about new visualization object that can be stored as MD to md server @@ -55,6 +57,18 @@ public List getMeasures() { return getContent().getMeasures(); } + /** + * Get measure by local identifier or null if not found + * @param localIdentifier of measure + * @return measure or null + */ + public Measure getMeasure(final String localIdentifier) { + return getMeasures().stream() + .filter(measure -> measure.getLocalIdentifier().equals(localIdentifier)) + .findFirst() + .orElse(null); + } + /** * @return all measures from all buckets whose measure definition is instance of {@link VOSimpleMeasureDefinition} */ @@ -73,6 +87,13 @@ public List getAttributes() { return getContent().getAttributes(); } + public VisualizationAttribute getAttribute(final String localIdentifier) { + return getAttributes().stream() + .filter(attribute -> attribute.getLocalIdentifier().equals(localIdentifier)) + .findFirst() + .orElse(null); + } + /** * Returns attribute from collection bucket, if and only if bucket contains exactly one item of type * {@link VisualizationAttribute}, null otherwise @@ -88,6 +109,11 @@ public VisualizationAttribute getAttributeFromCollection(final CollectionType ty .orElse(null); } + @JsonIgnore + public boolean hasMeasures() { + return !getMeasures().isEmpty(); + } + /** * @return true if visualization object contains at leas one PoP measure or measure with compute ratio, false otherwise */ @@ -229,6 +255,11 @@ public void setVisualizationClass(UriObjQualifier uri) { content.setVisualizationClass(uri); } + @JsonIgnore + public Execution convertToExecution(Function visualizationClassgetter) { + return VisualizationConverter.convertToExecution(this, visualizationClassgetter); + } + private Content getContent() { return content; } @@ -306,6 +337,10 @@ public String getVisualizationClassUri() { } public List getFilters() { + if (filters == null) { + return new ArrayList<>(); + } + return filters; } diff --git a/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy b/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy index c57b1bd88..e5531dabe 100644 --- a/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/BucketTest.groovy @@ -7,14 +7,12 @@ package com.gooddata.md.visualization import com.gooddata.executeafm.UriObjQualifier import nl.jqno.equalsverifier.EqualsVerifier -import nl.jqno.equalsverifier.Warning import org.apache.commons.lang3.SerializationUtils import spock.lang.Shared import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals -import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource import static spock.util.matcher.HamcrestSupport.that class BucketTest extends Specification { diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy new file mode 100644 index 000000000..0370a513b --- /dev/null +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.md.visualization + +import com.fasterxml.jackson.core.JsonParseException +import com.gooddata.executeafm.UriObjQualifier +import org.joda.time.LocalDate +import spock.lang.Specification +import com.gooddata.executeafm.afm.AbsoluteDateFilter +import com.gooddata.executeafm.afm.Afm +import com.gooddata.executeafm.afm.AttributeItem +import com.gooddata.executeafm.afm.MeasureItem +import com.gooddata.executeafm.afm.NegativeAttributeFilter +import com.gooddata.executeafm.afm.PositiveAttributeFilter +import com.gooddata.executeafm.afm.RelativeDateFilter +import com.gooddata.executeafm.resultspec.AttributeSortItem +import com.gooddata.executeafm.resultspec.Dimension +import com.gooddata.executeafm.resultspec.MeasureLocatorItem +import com.gooddata.executeafm.resultspec.MeasureSortItem +import com.gooddata.executeafm.resultspec.ResultSpec +import com.gooddata.executeafm.resultspec.SortItem +import spock.lang.Unroll + +import static VisualizationConverter.convertToAfm +import static VisualizationConverter.convertToResultSpec +import static VisualizationConverter.parseSorting +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static spock.util.matcher.HamcrestSupport.that + +class VisualizationObjectConverterTest extends Specification { + private static final String COMPLEX_VISUALIZATION = "md/visualization/complexVisualizationObject.json" + private static final String SIMPLE_VISUALIZATION = "md/visualization/simpleVisualizationObject.json" + + private static final String MULTIPLE_MEASURE_BUCKETS = "md/visualization/multipleMeasureBucketsVisualization.json" + private static final String MULTIPLE_ATTRIBUTE_BUCKETS = "md/visualization/multipleAttributeBucketsVisualization.json" + private static final String STACKED_COLUMN_CHART = "md/visualization/stackedColumnChart.json" + private static final String LINE_CHART = "md/visualization/lineChart.json" + + def "should convert complex"() { + given: + Afm expected = new Afm( + [new AttributeItem(new UriObjQualifier("/uri/to/displayForm/1"), "attribute1", "attributeAlias")], + [ + new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), + new AbsoluteDateFilter(new UriObjQualifier("/uri/to/dataSet/1"), new LocalDate("2000-08-30"), new LocalDate("2017-08-07")) + ], + [new MeasureItem(new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/1"), "sum", false, + [ + new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), []), + new NegativeAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), + new RelativeDateFilter(new UriObjQualifier("/uri/to/dataSet/2"), "month", 0, -11) + ] + ), + "measure1", "Measure 1 alias", null)], + null + ) + VisualizationObject visualizationObject = readObjectFromResource("/$COMPLEX_VISUALIZATION", VisualizationObject) + Afm converted = convertToAfm(visualizationObject) + + expect: + that converted, jsonEquals(expected) + } + + def "should convert simple"() { + given: + Afm expected = new Afm([], [], [], null) + VisualizationObject visualizationObject = readObjectFromResource("/$SIMPLE_VISUALIZATION", VisualizationObject) + Afm converted = convertToAfm(visualizationObject) + + expect: + that converted, jsonEquals(expected) + } + + + @Unroll + def "should generate result spec for table with default sorting from #name"() { + given: + VisualizationObject vo = readObjectFromResource("/$resource", VisualizationObject) + ResultSpec converted = convertToResultSpec(vo, VisualizationType.TABLE) + + expect: + that converted, jsonEquals(expected) + + where: + name | resource | expected + "measures" | MULTIPLE_MEASURE_BUCKETS | new ResultSpec( + [new Dimension([]), new Dimension("measureGroup")], + [new MeasureSortItem("desc", [new MeasureLocatorItem("measure1")])] + ) + "attributes" | MULTIPLE_ATTRIBUTE_BUCKETS | new ResultSpec( + [new Dimension(["attribute1", "attribute2", "attribute"], null)], + [new AttributeSortItem("asc", "attribute1")] + ) + } + + @Unroll + def "should generate result spec for #type"() { + given: + VisualizationObject vo = readObjectFromResource("/$resource", VisualizationObject) + ResultSpec converted = convertToResultSpec(vo, VisualizationType.of(type)) + + expect: + that converted, jsonEquals(expected) + + where: + type | resource | expected + "pie" | STACKED_COLUMN_CHART | new ResultSpec( + [new Dimension("measureGroup"), new Dimension("1")], + [new AttributeSortItem("asc", "1")] + ) + "bar" | STACKED_COLUMN_CHART | new ResultSpec( + [new Dimension("2"), new Dimension(["1", "measureGroup"], null)], + [new AttributeSortItem("asc", "1")] + ) + "line" | LINE_CHART | new ResultSpec( + [new Dimension("measureGroup"), new Dimension("1")], + [new AttributeSortItem("asc", "1")] + ) + } + + @Unroll + def "should return #value"() { + List sorts = parseSorting(properties) + + expect: + that sorts, jsonEquals(expected) + + where: + value << [ "attribute sorting", "measure sorting"] + properties << [ + '{"sortItems":[{"attributeSortItem":{"direction":"desc","attributeIdentifier":"id"}}]}', + '{"sortItems":[{"measureSortItem":{"direction":"desc","locators":[{"measureLocatorItem":{"measureIdentifier":"id"}}]}}]}' + ] + expected << [ + [new AttributeSortItem("desc", "id")], + [new MeasureSortItem("desc", [new MeasureLocatorItem("id")])] + ] + } + + @Unroll + def "should throw JsonParseException"() { + when: + parseSorting(properties) + + then: + thrown(JsonParseException) + + where: + properties << ['abcd', '{"sortItems":[{"someinvalidstring"}]}'] + } +} diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy index beb03be17..5619781f1 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy @@ -3,17 +3,14 @@ * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ - package com.gooddata.md.visualization -import com.fasterxml.jackson.databind.ObjectMapper import com.gooddata.executeafm.UriObjQualifier import com.gooddata.executeafm.afm.AbsoluteDateFilter import com.gooddata.executeafm.afm.NegativeAttributeFilter import com.gooddata.executeafm.afm.PositiveAttributeFilter import com.gooddata.executeafm.afm.RelativeDateFilter import com.gooddata.md.Meta -import nl.jqno.equalsverifier.EqualsVerifier import org.apache.commons.lang3.SerializationUtils import org.joda.time.LocalDate import spock.lang.Shared diff --git a/src/test/resources/md/visualization/complexVisualizationObject.json b/src/test/resources/md/visualization/complexVisualizationObject.json index 8ce0ba530..e0ce49718 100644 --- a/src/test/resources/md/visualization/complexVisualizationObject.json +++ b/src/test/resources/md/visualization/complexVisualizationObject.json @@ -42,10 +42,7 @@ "displayForm": { "uri": "/uri/to/displayForm/3" }, - "in": [ - "ab", - "cd" - ] + "in": [] } }, { "negativeAttributeFilter": { @@ -61,9 +58,7 @@ "absoluteDateFilter": { "dataSet": { "uri": "/uri/to/dataSet/1" - }, - "from": "2000-08-30", - "to": "2017-08-07" + } } }, { "relativeDateFilter": { @@ -99,10 +94,7 @@ "displayForm": { "uri": "/uri/to/displayForm/3" }, - "notIn": [ - "ab", - "cd" - ] + "notIn": [] } }, { "absoluteDateFilter": { @@ -117,9 +109,7 @@ "dataSet": { "uri": "/uri/to/dataSet/2" }, - "granularity": "month", - "from": 0, - "to": -11 + "granularity": "month" } } ], diff --git a/src/test/resources/md/visualization/lineChart.json b/src/test/resources/md/visualization/lineChart.json new file mode 100644 index 000000000..2a2d99765 --- /dev/null +++ b/src/test/resources/md/visualization/lineChart.json @@ -0,0 +1,52 @@ +{ + "visualizationObject": { + "meta": { + "title": "New insight" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "trend", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "1", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attributeAlias" + } + } + ] + }, { + "localIdentifier": "measure", + "items": [ + { + "measure": { + "localIdentifier": "measure1", + "title": "Measure 1", + "alias": "Measure 1 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/1" + }, + "aggregation": "sum", + "computeRatio": false, + "filters": [] + } + } + } + } + ] + } + ], + "filters": [], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value" } + } + } +} diff --git a/src/test/resources/md/visualization/multipleAttributeBucketsVisualization.json b/src/test/resources/md/visualization/multipleAttributeBucketsVisualization.json new file mode 100644 index 000000000..6accd89bf --- /dev/null +++ b/src/test/resources/md/visualization/multipleAttributeBucketsVisualization.json @@ -0,0 +1,52 @@ +{ + "visualizationObject": { + "meta": { + "title": "Attributes" + }, + "content": { + "visualizationClass": { + "uri": "visClass" + }, + "buckets": [ + { + "localIdentifier": "multipleAttributesBucket", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "attribute1", + "displayForm": { + "uri": "/uri/to/displayForm/1" + }, + "alias": "attribute1Alias" + } + }, { + "visualizationAttribute": { + "localIdentifier": "attribute2", + "displayForm": { + "uri": "/uri/to/displayForm/2" + }, + "alias": "attribute2Alias" + } + } + ] + }, { + "localIdentifier": "attributeBucket", + "items": [ + { + "visualizationAttribute": { + "localIdentifier": "attribute", + "displayForm": { + "uri": "/uri/to/displayForm" + }, + "alias": "Attribute Alias" + } + } + ] + } + ], + "filters": [], + "properties": "{\"key\":\"value\"}", + "references": { "key": "value" } + } + } +} From 81448f5f35ca59f08e601e9e05f6e482979ce0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 8 Feb 2018 09:51:02 +0100 Subject: [PATCH 039/548] bump version --- README.md | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b1152f432..5b59c921b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.20.2 + 2.21.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, diff --git a/pom.xml b/pom.xml index 9c9c3e05c..1dca5ce26 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.20.3-SNAPSHOT + 2.21.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.21.0 From c4f725d2ea132dbab4a3ef169f96e3d4172aefe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 8 Feb 2018 09:53:44 +0100 Subject: [PATCH 040/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1dca5ce26..d1a798227 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.21.0 + 2.21.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.21.0 + HEAD From 98da168447eba73430b16ca20927152220cbb69e Mon Sep 17 00:00:00 2001 From: Peter Lacko Date: Thu, 15 Feb 2018 16:07:26 +0100 Subject: [PATCH 041/548] Make measure filters in visualisation object voluntary --- .../visualization/VisualizationConverter.java | 10 +++++++++- .../VisualizationObjectConverterTest.groovy | 20 +++++++++++-------- .../VisualizationObjectTest.groovy | 7 +++++++ .../complexVisualizationObject.json | 12 +++++++++++ .../multipleMeasureBucketsVisualization.json | 3 +-- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java index 01081d08b..920dc6f3f 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java @@ -214,6 +214,7 @@ private static List convertFilters(final List f if (filters == null) { return new ArrayList<>(); } + List validFilters = removeIrrelevantFilters(filters); return getCompatibilityFilters(validFilters); } @@ -249,7 +250,14 @@ private static MeasureItem getAfmMeasure(final Measure measure) { private static MeasureItem convertMeasureFilters(final MeasureItem measure) { if (measure.getDefinition() instanceof SimpleMeasureDefinition) { List filters = ((SimpleMeasureDefinition) measure.getDefinition()).getFilters(); - List validFilters = removeIrrelevantFilters(filters); + + List validFilters; + if (filters == null) { + validFilters = new ArrayList<>(); + } else { + validFilters = removeIrrelevantFilters(filters); + } + ((SimpleMeasureDefinition) measure.getDefinition()).setFilters(validFilters); } diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy index 0370a513b..e439f2d0e 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy @@ -48,14 +48,18 @@ class VisualizationObjectConverterTest extends Specification { new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), new AbsoluteDateFilter(new UriObjQualifier("/uri/to/dataSet/1"), new LocalDate("2000-08-30"), new LocalDate("2017-08-07")) ], - [new MeasureItem(new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/1"), "sum", false, - [ - new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), []), - new NegativeAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), - new RelativeDateFilter(new UriObjQualifier("/uri/to/dataSet/2"), "month", 0, -11) - ] - ), - "measure1", "Measure 1 alias", null)], + [ + new MeasureItem(new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/0"), null, null, []), + "measure0", "Measure 0 alias", null), + new MeasureItem(new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/1"), "sum", false, + [ + new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), []), + new NegativeAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), + new RelativeDateFilter(new UriObjQualifier("/uri/to/dataSet/2"), "month", 0, -11) + ] + ), + "measure1", "Measure 1 alias", null) + ], null ) VisualizationObject visualizationObject = readObjectFromResource("/$COMPLEX_VISUALIZATION", VisualizationObject) diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy index 5619781f1..a81180edc 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy @@ -59,6 +59,13 @@ class VisualizationObjectTest extends Specification { [ new Bucket("bucket1", [attribute1]), new Bucket("bucket2", [ + new Measure( + new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/0"), null, null, null), + "measure0", + "Measure 0 alias", + null, + null + ), new Measure( measureDefinition, "measure1", diff --git a/src/test/resources/md/visualization/complexVisualizationObject.json b/src/test/resources/md/visualization/complexVisualizationObject.json index e0ce49718..a25cf4613 100644 --- a/src/test/resources/md/visualization/complexVisualizationObject.json +++ b/src/test/resources/md/visualization/complexVisualizationObject.json @@ -25,6 +25,18 @@ "localIdentifier": "bucket2", "items": [ { + "measure": { + "localIdentifier": "measure0", + "alias": "Measure 0 alias", + "definition": { + "measureDefinition": { + "item": { + "uri": "/uri/to/measure/0" + } + } + } + } + }, { "measure": { "localIdentifier": "measure1", "title": "Measure 1", diff --git a/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json b/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json index b89684db0..9f9820864 100644 --- a/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json +++ b/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json @@ -22,8 +22,7 @@ "uri": "/uri/to/measure/1" }, "aggregation": "sum", - "computeRatio": false, - "filters": [] + "computeRatio": false } } } From df6acc699028b673c83a1eb113220bb3eb6290a1 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 16 Feb 2018 10:15:41 +0100 Subject: [PATCH 042/548] bump version --- release.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/release.sh b/release.sh index d7c0be7d9..3af0d471f 100755 --- a/release.sh +++ b/release.sh @@ -2,6 +2,7 @@ usage(){ echo "Usage: $0 -v -g " + echo "Or if you want to be asked fro GPG password without printing to console: $0 -v " exit 1 } @@ -49,9 +50,14 @@ fi if [ -z "${gpg_pass}" ] then - echo "No gpg password given!" - usage - exit 1 + echo "Enter gpg password: " + read -s gpg_pass + if [ -z "${gpg_pass}" ] + then + echo "No gpg password given!" + usage + exit 1 + fi fi mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" From eeff0a3d5a8476da960eb0cfa8654cc68cf19795 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 16 Feb 2018 10:24:40 +0100 Subject: [PATCH 043/548] [maven-release-plugin] prepare release gooddata-java-2.21.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d1a798227..cc7e50303 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.21.1-SNAPSHOT + 2.21.1 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.21.1 From f2ee5c0e5e634c7671af4c33be3590bbd461f15c Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 16 Feb 2018 10:24:41 +0100 Subject: [PATCH 044/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cc7e50303..d168e7b59 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.21.1 + 2.21.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.21.1 + HEAD From cc5fe5c64e1c71dce5ef442d96305ec266a39eff Mon Sep 17 00:00:00 2001 From: Peter Lacko Date: Mon, 26 Feb 2018 14:22:14 +0100 Subject: [PATCH 045/548] Remove default sorting from ResultSpec in VisualizationConverter --- .../visualization/VisualizationConverter.java | 18 ++---------------- .../VisualizationObjectConverterTest.groovy | 10 +++++----- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java index 920dc6f3f..dbe23dfe7 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java @@ -86,7 +86,8 @@ static List getSorting(final VisualizationObject visualizationObject) return sorts; } } catch (Exception ignored) {} - return generateDefaultSorting(visualizationObject); + + return null; } static List parseSorting(final String properties) throws Exception { @@ -96,21 +97,6 @@ static List parseSorting(final String properties) throws Exception { return MAPPER.convertValue(nodeSortItems, mapType); } - private static List generateDefaultSorting(final VisualizationObject visualizationObject) { - List attributes = visualizationObject.getAttributes(); - if(!attributes.isEmpty()) { - return Collections.singletonList(new AttributeSortItem(Direction.ASC, attributes.get(0).getLocalIdentifier())); - } - - List measures = visualizationObject.getMeasures(); - if(!measures.isEmpty()) { - MeasureLocatorItem locator = new MeasureLocatorItem(measures.get(0).getLocalIdentifier()); - return Collections.singletonList(new MeasureSortItem(Direction.DESC, Collections.singletonList(locator))); - } - - return null; - } - private static List getDimensions(final VisualizationObject visualizationObject, final VisualizationType visualizationType) { switch (visualizationType) { diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy index e439f2d0e..a47b81f54 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy @@ -93,11 +93,11 @@ class VisualizationObjectConverterTest extends Specification { name | resource | expected "measures" | MULTIPLE_MEASURE_BUCKETS | new ResultSpec( [new Dimension([]), new Dimension("measureGroup")], - [new MeasureSortItem("desc", [new MeasureLocatorItem("measure1")])] + null ) "attributes" | MULTIPLE_ATTRIBUTE_BUCKETS | new ResultSpec( [new Dimension(["attribute1", "attribute2", "attribute"], null)], - [new AttributeSortItem("asc", "attribute1")] + null ) } @@ -114,15 +114,15 @@ class VisualizationObjectConverterTest extends Specification { type | resource | expected "pie" | STACKED_COLUMN_CHART | new ResultSpec( [new Dimension("measureGroup"), new Dimension("1")], - [new AttributeSortItem("asc", "1")] + null ) "bar" | STACKED_COLUMN_CHART | new ResultSpec( [new Dimension("2"), new Dimension(["1", "measureGroup"], null)], - [new AttributeSortItem("asc", "1")] + null ) "line" | LINE_CHART | new ResultSpec( [new Dimension("measureGroup"), new Dimension("1")], - [new AttributeSortItem("asc", "1")] + null ) } From d9dd8a24c01e3e40a0eb1254ffa1506277378389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 1 Mar 2018 09:10:19 +0100 Subject: [PATCH 046/548] bump version --- README.md | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5b59c921b..ccc968c9a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.21.0 + 2.21.2 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, diff --git a/pom.xml b/pom.xml index d168e7b59..af5f1366e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.21.2-SNAPSHOT + 2.21.2 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.21.2 From 4b89e377d09482fb23a30256ea599663acffcb2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 1 Mar 2018 09:13:44 +0100 Subject: [PATCH 047/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index af5f1366e..31ab08b9c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.21.2 + 2.21.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.21.2 + HEAD From ef3d896b00f8f076bb0316f0a02f0213187874d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Thu, 1 Mar 2018 09:08:44 +0100 Subject: [PATCH 048/548] introduce LcmService Resolves #586 --- src/main/java/com/gooddata/GoodData.java | 12 ++ .../java/com/gooddata/lcm/LcmEntities.java | 65 ++++++++ src/main/java/com/gooddata/lcm/LcmEntity.java | 144 ++++++++++++++++++ .../com/gooddata/lcm/LcmEntityFilter.java | 98 ++++++++++++ .../java/com/gooddata/lcm/LcmService.java | 117 ++++++++++++++ .../com/gooddata/lcm/LcmEntitiesTest.groovy | 49 ++++++ .../gooddata/lcm/LcmEntityFilterTest.groovy | 25 +++ .../com/gooddata/lcm/LcmEntityTest.groovy | 72 +++++++++ .../com/gooddata/lcm/LcmServiceIT.groovy | 51 +++++++ src/test/resources/lcm/lcmEntities.json | 15 ++ src/test/resources/lcm/lcmEntitiesEmpty.json | 7 + src/test/resources/lcm/lcmEntity.json | 7 + src/test/resources/lcm/lcmEntityFull.json | 13 ++ 13 files changed, 675 insertions(+) create mode 100644 src/main/java/com/gooddata/lcm/LcmEntities.java create mode 100644 src/main/java/com/gooddata/lcm/LcmEntity.java create mode 100644 src/main/java/com/gooddata/lcm/LcmEntityFilter.java create mode 100644 src/main/java/com/gooddata/lcm/LcmService.java create mode 100644 src/test/groovy/com/gooddata/lcm/LcmEntitiesTest.groovy create mode 100644 src/test/groovy/com/gooddata/lcm/LcmEntityFilterTest.groovy create mode 100644 src/test/groovy/com/gooddata/lcm/LcmEntityTest.groovy create mode 100644 src/test/groovy/com/gooddata/lcm/LcmServiceIT.groovy create mode 100644 src/test/resources/lcm/lcmEntities.json create mode 100644 src/test/resources/lcm/lcmEntitiesEmpty.json create mode 100644 src/test/resources/lcm/lcmEntity.json create mode 100644 src/test/resources/lcm/lcmEntityFull.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index b7f34f71a..ab890ffd8 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -14,6 +14,7 @@ import com.gooddata.export.ExportService; import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.gdc.Header; +import com.gooddata.lcm.LcmService; import com.gooddata.md.maintenance.ExportImportService; import com.gooddata.notification.NotificationService; import com.gooddata.projecttemplate.ProjectTemplateService; @@ -95,6 +96,7 @@ public class GoodData { private final ExportService exportService; private final AuditEventService auditEventService; private final ExecuteAfmService executeAfmService; + private final LcmService lcmService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -232,6 +234,7 @@ protected GoodData(GoodDataEndpoint endpoint, Authentication authentication, Goo projectTemplateService = new ProjectTemplateService(getRestTemplate(), settings); auditEventService = new AuditEventService(getRestTemplate(), accountService, settings); executeAfmService = new ExecuteAfmService(getRestTemplate(), settings); + lcmService = new LcmService(getRestTemplate(), settings); } static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient httpClient) { @@ -507,5 +510,14 @@ public ExecuteAfmService getExecuteAfmService() { return executeAfmService; } + /** + * Get initialized service for Life Cycle Management + * @return initialized service for Life Cycle Management + */ + @Bean + public LcmService getLcmService() { + return lcmService; + } + } diff --git a/src/main/java/com/gooddata/lcm/LcmEntities.java b/src/main/java/com/gooddata/lcm/LcmEntities.java new file mode 100644 index 000000000..8e1e7bff3 --- /dev/null +++ b/src/main/java/com/gooddata/lcm/LcmEntities.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.collections.PageableList; +import com.gooddata.collections.PageableListDeserializer; +import com.gooddata.collections.PageableListSerializer; +import com.gooddata.collections.Paging; +import org.springframework.web.util.UriTemplate; + +import java.util.List; +import java.util.Map; + +import static java.util.Arrays.asList; + +/** + * List of {@link LcmEntity}. + */ +@JsonDeserialize(using = LcmEntities.Deserializer.class) +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName(LcmEntities.ROOT_NODE) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(using = LcmEntities.Serializer.class) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class LcmEntities extends PageableList { + + public static final String URI = "/gdc/account/profile/{profileId}/lcmEntities"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + static final String ROOT_NODE = "lcmEntities"; + + public LcmEntities(final List items, final Paging paging, final Map links) { + super(items, paging, links); + } + + LcmEntities(final LcmEntity... lcmEntities) { + this(asList(lcmEntities), null, null); + } + + static class Serializer extends PageableListSerializer { + public Serializer() { + super(ROOT_NODE); + } + } + + static class Deserializer extends PageableListDeserializer { + protected Deserializer() { + super(LcmEntity.class); + } + + @Override + protected LcmEntities createList(final List items, final Paging paging, final Map links) { + return new LcmEntities(items, paging, links); + } + } +} diff --git a/src/main/java/com/gooddata/lcm/LcmEntity.java b/src/main/java/com/gooddata/lcm/LcmEntity.java new file mode 100644 index 000000000..5d753a9d7 --- /dev/null +++ b/src/main/java/com/gooddata/lcm/LcmEntity.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.util.Map; +import java.util.Objects; + +import static com.gooddata.lcm.LcmEntity.LinkCategory.CLIENT; +import static com.gooddata.lcm.LcmEntity.LinkCategory.DATA_PRODUCT; +import static com.gooddata.lcm.LcmEntity.LinkCategory.PROJECT; +import static com.gooddata.lcm.LcmEntity.LinkCategory.SEGMENT; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; + +/** + * Single Life Cycle Management entity representing the relation between {@link com.gooddata.project.Project}, + * Client, Segment and DataProduct. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class LcmEntity { + + private final String projectId; + private final String projectTitle; + private final String clientId; + private final String segmentId; + private final String dataProductId; + private final Map links; + + /** + * Creates new instance of given project id and title + * @param projectId id of the project + * @param projectTitle title of the project + * @param links links + */ + public LcmEntity(final String projectId, final String projectTitle, final Map links) { + this(projectId, projectTitle, null, null, null, links); + } + + @JsonCreator + public LcmEntity(@JsonProperty("projectId") final String projectId, + @JsonProperty("projectTitle") final String projectTitle, + @JsonProperty("clientId") final String clientId, + @JsonProperty("segmentId") final String segmentId, + @JsonProperty("dataProductId") final String dataProductId, + @JsonProperty("links") final Map links) { + this.projectId = notEmpty(projectId, "projectId"); + this.projectTitle = notNull(projectTitle, "projectTitle"); + this.clientId = clientId; + this.segmentId = segmentId; + this.dataProductId = dataProductId; + this.links = notNull(links, "links"); + } + + public String getProjectId() { + return projectId; + } + + public String getProjectTitle() { + return projectTitle; + } + + public String getClientId() { + return clientId; + } + + public String getSegmentId() { + return segmentId; + } + + public String getDataProductId() { + return dataProductId; + } + + public Map getLinks() { + return links; + } + + @JsonIgnore + public String getProjectUri() { + return getLink(PROJECT); + } + + @JsonIgnore + public String getClientUri() { + return getLink(CLIENT); + } + + @JsonIgnore + public String getSegmentUri() { + return getLink(SEGMENT); + } + + @JsonIgnore + public String getDataProductUri() { + return getLink(DATA_PRODUCT); + } + + private String getLink(final String link) { + return notNullState(links, "links").get(link); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final LcmEntity lcmEntity = (LcmEntity) o; + return Objects.equals(projectId, lcmEntity.projectId) && + Objects.equals(projectTitle, lcmEntity.projectTitle) && + Objects.equals(clientId, lcmEntity.clientId) && + Objects.equals(segmentId, lcmEntity.segmentId) && + Objects.equals(dataProductId, lcmEntity.dataProductId) && + Objects.equals(links, lcmEntity.links); + } + + @Override + public int hashCode() { + + return Objects.hash(projectId, projectTitle, clientId, segmentId, dataProductId, links); + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + + public static class LinkCategory { + public static final String PROJECT = "project"; + public static final String CLIENT = "client"; + public static final String SEGMENT = "segment"; + public static final String DATA_PRODUCT = "dataProduct"; + } +} diff --git a/src/main/java/com/gooddata/lcm/LcmEntityFilter.java b/src/main/java/com/gooddata/lcm/LcmEntityFilter.java new file mode 100644 index 000000000..055805443 --- /dev/null +++ b/src/main/java/com/gooddata/lcm/LcmEntityFilter.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm; + +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import static java.util.Collections.singletonList; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +/** + * Specification of the filter on {@link LcmEntities}. + */ +public class LcmEntityFilter { + + private static final String DATA_PRODUCT = "dataProduct"; + private static final String SEGMENT = "segment"; + private static final String CLIENT = "client"; + + private String dataProduct; + private String segment; + private String client; + + /** + * Creates new (empty) filter. + */ + public LcmEntityFilter() { + } + + /** + * Adds given data product to this filter. + * @param dataProduct data product id - must not be empty. + * @return this filter + */ + public LcmEntityFilter withDataProduct(final String dataProduct) { + if (isNotBlank(dataProduct)) { + this.dataProduct = dataProduct; + } + return this; + } + + /** + * Adds given segment to this filter. + * @param segment segment id - must not be empty. + * @return this filter + */ + public LcmEntityFilter withSegment(final String segment) { + if (isNotBlank(segment)) { + this.segment = segment; + } + return this; + } + + /** + * Adds given client to this filter. + * @param client client id - must not be empty. + * @return this filter + */ + public LcmEntityFilter withClient(final String client) { + if (isNotBlank(client)) { + this.client = client; + } + return this; + } + + public String getDataProduct() { + return dataProduct; + } + + public String getSegment() { + return segment; + } + + public String getClient() { + return client; + } + + /** + * This filter in the form of query parameters map. + * @return filter as query params map + */ + public MultiValueMap asQueryParams() { + final MultiValueMap params = new LinkedMultiValueMap<>(); + if (dataProduct != null) { + params.put(DATA_PRODUCT, singletonList(dataProduct)); + } + if (segment != null) { + params.put(SEGMENT, singletonList(segment)); + } + if (client != null) { + params.put(CLIENT, singletonList(client)); + } + return params; + } +} diff --git a/src/main/java/com/gooddata/lcm/LcmService.java b/src/main/java/com/gooddata/lcm/LcmService.java new file mode 100644 index 000000000..8a9c48bdd --- /dev/null +++ b/src/main/java/com/gooddata/lcm/LcmService.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm; + +import com.gooddata.AbstractService; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataSettings; +import com.gooddata.account.Account; +import com.gooddata.collections.MultiPageList; +import com.gooddata.collections.Page; +import com.gooddata.collections.PageRequest; +import com.gooddata.collections.PageableList; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.net.URI; + +import static com.gooddata.util.Validate.notNull; + +/** + * Service, which provides access to lifecycle management objects. + */ +public class LcmService extends AbstractService { + + /** + * Constructs service for GoodData Life Cycle Management. + * + * @param restTemplate RESTful HTTP Spring template + * @param settings settings + */ + public LcmService(final RestTemplate restTemplate, final GoodDataSettings settings) { + super(restTemplate, settings); + } + + /** + * Lists all {@link LcmEntities} for given {@link Account}. + * Returns empty list in case there is no {@link LcmEntity}. + * Returns only first page if there's more instances than page limit. Use {@link PageableList#stream()} to iterate + * over all pages, or {@link MultiPageList#collectAll()} to load the entire list. + * + * @param account account to list LCM entities for + * @return MultiPageList first page of list of lcm entities or empty list + */ + public PageableList listLcmEntities(final Account account) { + return listLcmEntities(account, new PageRequest()); + } + + /** + * Lists {@link LcmEntities} for given {@link Account} filtered according given {@link LcmEntityFilter}. + * Returns empty list in case there is no {@link LcmEntity}. + * Returns only first page if there's more instances than page limit. Use {@link PageableList#stream()} to iterate + * over all pages, or {@link MultiPageList#collectAll()} to load the entire list. + * + * @param account account to list LCM entities for + * @param filter filter of the entities + * @return MultiPageList first page of list of lcm entitiesor empty list + */ + public PageableList listLcmEntities(final Account account, final LcmEntityFilter filter) { + return listLcmEntities(account, filter, new PageRequest()); + } + + /** + * Lists all {@link LcmEntities} for given {@link Account}. + * Returns empty list in case there is no {@link LcmEntity}. + * Returns requested page (by page limit and offset). Use {@link #listLcmEntities(Account)} to get first page with default setting. + * + * @param account account to list LCM entities for + * @param startPage page to be listed + * @return MultiPageList requested page of list of lcm entities or empty list + */ + public PageableList listLcmEntities(final Account account, final Page startPage) { + return listLcmEntities(account, new LcmEntityFilter(), startPage); + } + + /** + * Lists {@link LcmEntities} for given {@link Account} filtered according given {@link LcmEntityFilter}. + * Returns empty list in case there is no {@link LcmEntity}. + * Returns requested page (by page limit and offset). Use {@link #listLcmEntities(Account)} to get first page with default setting. + * + * @param account account to list LCM entities for + * @param filter filter of the entities + * @param startPage page to be listed + * @return MultiPageList requested page of list of lcm entities or empty list + */ + public PageableList listLcmEntities(final Account account, final LcmEntityFilter filter, final Page startPage) { + notNull(filter, "filter"); + notNull(startPage, "startPage"); + final String accountId = notNull(account, "account").getId(); + return new MultiPageList<>(startPage, page -> listLcmEntities(getLcmEntitiesUri(accountId, filter, page))); + } + + private URI getLcmEntitiesUri(final String accountId) { + return LcmEntities.TEMPLATE.expand(accountId); + } + + private URI getLcmEntitiesUri(final String accountId, final LcmEntityFilter filter, final Page page) { + return page.getPageUri( + UriComponentsBuilder.fromUri(getLcmEntitiesUri(accountId)) + .queryParams(filter.asQueryParams())); + } + + private PageableList listLcmEntities(final URI uri) { + try { + final LcmEntities result = restTemplate.getForObject(uri, LcmEntities.class); + if (result == null) { + return new PageableList<>(); + } + return result; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list LcmEntity", e); + } + } +} diff --git a/src/test/groovy/com/gooddata/lcm/LcmEntitiesTest.groovy b/src/test/groovy/com/gooddata/lcm/LcmEntitiesTest.groovy new file mode 100644 index 000000000..545b3ee6c --- /dev/null +++ b/src/test/groovy/com/gooddata/lcm/LcmEntitiesTest.groovy @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm + +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class LcmEntitiesTest extends Specification { + + private static final String EMPTY_JSON = 'lcm/lcmEntitiesEmpty.json' + private static final String LCM_ENTITIES_JSON = 'lcm/lcmEntities.json' + + def "should serialize empty"() { + expect: + that new LcmEntities(), jsonEquals(resource(EMPTY_JSON)) + } + + def "should serialize"() { + expect: + that new LcmEntities(new LcmEntity('PROJECT_ID', 'PROJECT_TITLE', [project: '/gdc/projects/PROJECT_ID'])), + jsonEquals(resource(LCM_ENTITIES_JSON)) + } + + def "should deserialize empty"() { + when: + LcmEntities lcmEntities = readObjectFromResource("/$EMPTY_JSON", LcmEntities) + + then: + lcmEntities.size() == 0 + lcmEntities.paging + } + + def "should deserialize"() { + when: + LcmEntities lcmEntities = readObjectFromResource("/$LCM_ENTITIES_JSON", LcmEntities) + + then: + lcmEntities.size() == 1 + lcmEntities.first().projectId == 'PROJECT_ID' + lcmEntities.paging + } +} diff --git a/src/test/groovy/com/gooddata/lcm/LcmEntityFilterTest.groovy b/src/test/groovy/com/gooddata/lcm/LcmEntityFilterTest.groovy new file mode 100644 index 000000000..2f4b594c9 --- /dev/null +++ b/src/test/groovy/com/gooddata/lcm/LcmEntityFilterTest.groovy @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm + +import spock.lang.Specification + +class LcmEntityFilterTest extends Specification { + + def "should work empty"() { + expect: + new LcmEntityFilter().asQueryParams() == [:] + } + + def "should add all"() { + expect: + new LcmEntityFilter() + .withDataProduct('dp') + .withSegment('seg') + .withClient('c') + .asQueryParams() == [dataProduct: ['dp'], segment: ['seg'], client: ['c']] + } +} diff --git a/src/test/groovy/com/gooddata/lcm/LcmEntityTest.groovy b/src/test/groovy/com/gooddata/lcm/LcmEntityTest.groovy new file mode 100644 index 000000000..01e9df16f --- /dev/null +++ b/src/test/groovy/com/gooddata/lcm/LcmEntityTest.groovy @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm + +import nl.jqno.equalsverifier.EqualsVerifier +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class LcmEntityTest extends Specification { + + private static final String LCM_ENTITY_JSON = 'lcm/lcmEntity.json' + private static final String LCM_ENTITY_FULL_JSON = 'lcm/lcmEntityFull.json' + + def "should serialize"() { + expect: + that new LcmEntity('PROJECT_ID', 'PROJECT_TITLE', [project: '/gdc/projects/PROJECT_ID']), + jsonEquals(resource(LCM_ENTITY_JSON)) + } + + def "should serialize full"() { + expect: + that new LcmEntity('PROJECT_ID', 'PROJECT_TITLE', 'CLIENT', 'SEGMENT', 'DATA_PRODUCT', + [ + project: '/gdc/projects/PROJECT_ID', + client: '/gdc/domains/default/dataproducts/DATA_PRODUCT/clients/CLIENT', + segment: '/gdc/domains/default/dataproducts/DATA_PRODUCT/segments/SEGMENT', + dataProduct: '/gdc/domains/default/dataproducts/DATA_PRODUCT' + ]), + jsonEquals(resource(LCM_ENTITY_FULL_JSON)) + } + + def "should deserialize"() { + when: + LcmEntity lcmEntity = readObjectFromResource("/$LCM_ENTITY_JSON", LcmEntity) + + then: + lcmEntity.projectId == 'PROJECT_ID' + lcmEntity.projectTitle == 'PROJECT_TITLE' + lcmEntity.links.size() == 1 + lcmEntity.projectUri == '/gdc/projects/PROJECT_ID' + } + + def "should deserialize full"() { + when: + LcmEntity lcmEntity = readObjectFromResource("/$LCM_ENTITY_FULL_JSON", LcmEntity) + + then: + lcmEntity.projectId == 'PROJECT_ID' + lcmEntity.projectTitle == 'PROJECT_TITLE' + lcmEntity.clientId == 'CLIENT' + lcmEntity.segmentId == 'SEGMENT' + lcmEntity.dataProductId == 'DATA_PRODUCT' + lcmEntity.links.size() == 4 + lcmEntity.projectUri == '/gdc/projects/PROJECT_ID' + lcmEntity.clientUri == '/gdc/domains/default/dataproducts/DATA_PRODUCT/clients/CLIENT' + lcmEntity.segmentUri == '/gdc/domains/default/dataproducts/DATA_PRODUCT/segments/SEGMENT' + lcmEntity.dataProductUri == '/gdc/domains/default/dataproducts/DATA_PRODUCT' + lcmEntity.toString() + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(LcmEntity).usingGetClass().verify() + } +} diff --git a/src/test/groovy/com/gooddata/lcm/LcmServiceIT.groovy b/src/test/groovy/com/gooddata/lcm/LcmServiceIT.groovy new file mode 100644 index 000000000..495743de1 --- /dev/null +++ b/src/test/groovy/com/gooddata/lcm/LcmServiceIT.groovy @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.lcm + +import com.gooddata.GoodDataITBase +import com.gooddata.account.Account +import spock.lang.Shared +import spock.lang.Unroll + +import static com.gooddata.util.ResourceUtils.readFromResource +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.jadler.Jadler.onRequest + +class LcmServiceIT extends GoodDataITBase { + + @Shared Account account = readObjectFromResource('/account/account.json', Account) + @Shared LcmEntityFilter filter = new LcmEntityFilter().withDataProduct('dp').withSegment('seg').withClient('c') + + @Unroll + def "should list #type"() { + given: + onRequest() + .havingMethodEqualTo('GET') + .havingPathEqualTo('/gdc/account/profile/ID/lcmEntities') + .havingQueryStringEqualTo(queryString) + .respond() + .withBody(readFromResource('/lcm/lcmEntities.json')) + .withStatus(200) + + when: + def entities = list(service) + + then: + entities.size() == 1 + + where: + type | list || queryString + 'all' | { it.listLcmEntities(account) } || 'limit=100' + 'filtered' | { it.listLcmEntities(account, filter) } || 'dataProduct=dp&segment=seg&client=c&limit=100' + } + + + + @Override + protected LcmService getService() { + return gd.lcmService + } +} diff --git a/src/test/resources/lcm/lcmEntities.json b/src/test/resources/lcm/lcmEntities.json new file mode 100644 index 000000000..ca9c15ad3 --- /dev/null +++ b/src/test/resources/lcm/lcmEntities.json @@ -0,0 +1,15 @@ +{ + "lcmEntities": { + "items": [ + { + "projectId": "PROJECT_ID", + "projectTitle": "PROJECT_TITLE", + "links": { + "project": "/gdc/projects/PROJECT_ID" + } + } + ], + "paging": {}, + "links": {} + } +} \ No newline at end of file diff --git a/src/test/resources/lcm/lcmEntitiesEmpty.json b/src/test/resources/lcm/lcmEntitiesEmpty.json new file mode 100644 index 000000000..89088279a --- /dev/null +++ b/src/test/resources/lcm/lcmEntitiesEmpty.json @@ -0,0 +1,7 @@ +{ + "lcmEntities": { + "items": [], + "paging": {}, + "links": {} + } +} \ No newline at end of file diff --git a/src/test/resources/lcm/lcmEntity.json b/src/test/resources/lcm/lcmEntity.json new file mode 100644 index 000000000..da5e7c67d --- /dev/null +++ b/src/test/resources/lcm/lcmEntity.json @@ -0,0 +1,7 @@ +{ + "projectId": "PROJECT_ID", + "projectTitle": "PROJECT_TITLE", + "links": { + "project": "/gdc/projects/PROJECT_ID" + } +} \ No newline at end of file diff --git a/src/test/resources/lcm/lcmEntityFull.json b/src/test/resources/lcm/lcmEntityFull.json new file mode 100644 index 000000000..ce46f7d0f --- /dev/null +++ b/src/test/resources/lcm/lcmEntityFull.json @@ -0,0 +1,13 @@ +{ + "projectId": "PROJECT_ID", + "projectTitle": "PROJECT_TITLE", + "clientId": "CLIENT", + "segmentId": "SEGMENT", + "dataProductId": "DATA_PRODUCT", + "links": { + "project": "/gdc/projects/PROJECT_ID", + "client": "/gdc/domains/default/dataproducts/DATA_PRODUCT/clients/CLIENT", + "segment": "/gdc/domains/default/dataproducts/DATA_PRODUCT/segments/SEGMENT", + "dataProduct": "/gdc/domains/default/dataproducts/DATA_PRODUCT" + } +} \ No newline at end of file From b3aa01e0e682684ac55851b777f19e031a29d9b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 6 Mar 2018 17:29:53 +0100 Subject: [PATCH 049/548] [maven-release-plugin] prepare release gooddata-java-2.22.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 31ab08b9c..b0dbd25af 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.21.3-SNAPSHOT + 2.22.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.22.0 From cf57399644aa142748679f7ac68fb5303c6bcc2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 6 Mar 2018 17:29:53 +0100 Subject: [PATCH 050/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b0dbd25af..c7504310d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.22.0 + 2.22.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.22.0 + HEAD From 72d5b8d2f757bc800c2d811ef0d1bb604fd41c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 6 Mar 2018 17:34:44 +0100 Subject: [PATCH 051/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ccc968c9a..2b3118152 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.21.2 + 2.22.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From d49d19a8e9d4c6f33b57f8aa26ee64c0117bb255 Mon Sep 17 00:00:00 2001 From: Marek Ciz Date: Tue, 3 Apr 2018 15:27:10 +0200 Subject: [PATCH 052/548] Add new properties (zopimUrl and account) to Zendesk4Settings --- .../gooddata/connector/Zendesk4Settings.java | 27 ++++++++++++- .../connector/Zendesk4SettingsTest.java | 40 ++++++++++++++++++- .../settings-zendesk4-before-template26.json | 8 ++++ .../connector/settings-zendesk4.json | 2 + 4 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/connector/settings-zendesk4-before-template26.json diff --git a/src/main/java/com/gooddata/connector/Zendesk4Settings.java b/src/main/java/com/gooddata/connector/Zendesk4Settings.java index e778068f8..16d80a904 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Settings.java +++ b/src/main/java/com/gooddata/connector/Zendesk4Settings.java @@ -20,19 +20,26 @@ public class Zendesk4Settings implements Settings { public static final String URL = "/gdc/projects/{project}/connectors/zendesk4/integration/settings"; private String apiUrl; + private String zopimUrl; + private String account; private final String type; private final String syncTime; private final String syncTimeZone; public Zendesk4Settings(final String apiUrl) { - this(apiUrl, null, null, null); + this(apiUrl, null, null, null, null, null); } @JsonCreator - public Zendesk4Settings(@JsonProperty("apiUrl") String apiUrl, @JsonProperty("type") String type, + public Zendesk4Settings(@JsonProperty("apiUrl") String apiUrl, + @JsonProperty("zopimUrl") String zopimUrl, + @JsonProperty("account") String account, + @JsonProperty("type") String type, @JsonProperty("syncTime") String syncTime, @JsonProperty("syncTimeZone") String syncTimeZone) { this.apiUrl = notEmpty(apiUrl, "apiUrl"); + this.zopimUrl = zopimUrl; + this.account = account; this.type = type; this.syncTime = syncTime; this.syncTimeZone = syncTimeZone; @@ -46,6 +53,22 @@ public void setApiUrl(final String apiUrl) { this.apiUrl = notEmpty(apiUrl, "apiUrl"); } + public String getZopimUrl() { + return zopimUrl; + } + + public void setZopimUrl(final String zopimUrl) { + this.zopimUrl = zopimUrl; + } + + public String getAccount() { + return account; + } + + public void setAccount(final String account) { + this.account = account; + } + public String getType() { return type; } diff --git a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java index 233170fe2..7311b1066 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java @@ -14,6 +14,7 @@ import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; @@ -21,16 +22,39 @@ public class Zendesk4SettingsTest { @Test public void shouldSerialize() throws Exception { - final Zendesk4Settings settings = new Zendesk4Settings("https://foo.com", plus.name(), "12am", "America/Los_Angeles"); + final Zendesk4Settings settings = new Zendesk4Settings("https://foo.com", "zopim.com", "testAccount", + plus.name(), "12am", "America/Los_Angeles"); assertThat(settings, jsonEquals(resource("connector/settings-zendesk4.json"))); } + @Test + public void shouldSerialize_beforeTemplate26() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("https://foo.com", null, null, + plus.name(), "12am", "America/Los_Angeles"); + assertThat(settings, jsonEquals(resource("connector/settings-zendesk4-before-template26.json"))); + } + @Test public void shouldDeserialize() throws Exception { final Zendesk4Settings settings = readObjectFromResource("/connector/settings-zendesk4.json", Zendesk4Settings.class); assertThat(settings, is(notNullValue())); assertThat(settings.getApiUrl(), is("https://foo.com")); + assertThat(settings.getZopimUrl(), is("zopim.com")); + assertThat(settings.getAccount(), is("testAccount")); + assertThat(settings.getType(), is(plus.name())); + assertThat(settings.getSyncTime(), is("12am")); + assertThat(settings.getSyncTimeZone(), is("America/Los_Angeles")); + } + + @Test + public void shouldDeserialize_beforeTemplate26() throws Exception { + final Zendesk4Settings settings = readObjectFromResource("/connector/settings-zendesk4-before-template26.json", Zendesk4Settings.class); + + assertThat(settings, is(notNullValue())); + assertThat(settings.getApiUrl(), is("https://foo.com")); + assertThat(settings.getZopimUrl(), is(nullValue())); + assertThat(settings.getAccount(), is(nullValue())); assertThat(settings.getType(), is(plus.name())); assertThat(settings.getSyncTime(), is("12am")); assertThat(settings.getSyncTimeZone(), is("America/Los_Angeles")); @@ -60,6 +84,20 @@ public void testSetApiUrl() throws Exception { assertThat(settings.getApiUrl(), is("new url")); } + @Test + public void testSetZopimUrl() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("api url"); + settings.setZopimUrl("zopim url"); + assertThat(settings.getZopimUrl(), is("zopim url")); + } + + @Test + public void testSetAccount() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("api url"); + settings.setAccount("test account"); + assertThat(settings.getAccount(), is("test account")); + } + @Test public void testToStringFormat() { final Zendesk4Settings settings = new Zendesk4Settings("old url"); diff --git a/src/test/resources/connector/settings-zendesk4-before-template26.json b/src/test/resources/connector/settings-zendesk4-before-template26.json new file mode 100644 index 000000000..415a120fe --- /dev/null +++ b/src/test/resources/connector/settings-zendesk4-before-template26.json @@ -0,0 +1,8 @@ +{ + "settings" : { + "apiUrl" : "https://foo.com", + "type" : "plus", + "syncTime" : "12am", + "syncTimeZone" : "America/Los_Angeles" + } +} \ No newline at end of file diff --git a/src/test/resources/connector/settings-zendesk4.json b/src/test/resources/connector/settings-zendesk4.json index 415a120fe..5636096ed 100644 --- a/src/test/resources/connector/settings-zendesk4.json +++ b/src/test/resources/connector/settings-zendesk4.json @@ -1,6 +1,8 @@ { "settings" : { "apiUrl" : "https://foo.com", + "zopimUrl" : "zopim.com", + "account" : "testAccount", "type" : "plus", "syncTime" : "12am", "syncTimeZone" : "America/Los_Angeles" From 4b7e96000d9891fc36e6a9fb7becdf5d7bef714a Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 6 Apr 2018 15:50:23 +0200 Subject: [PATCH 053/548] introduce execution of visualization object in ExecuteAfmService --- src/main/java/com/gooddata/GoodData.java | 2 - .../executeafm/ExecuteAfmService.java | 52 ++++++++-- .../executeafm/VisualizationExecution.java | 97 +++++++++++++++++++ .../executeafm/ExecuteAfmServiceIT.groovy | 64 +++++++++--- .../VisualizationExecutionTest.groovy | 58 +++++++++++ .../executeafm/ExecuteAfmServiceAT.java | 2 +- .../executeafm/visualizationExecution.json | 5 + .../visualizationExecutionFull.json | 36 +++++++ 8 files changed, 294 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/VisualizationExecution.java create mode 100644 src/test/groovy/com/gooddata/executeafm/VisualizationExecutionTest.groovy create mode 100644 src/test/resources/executeafm/visualizationExecution.json create mode 100644 src/test/resources/executeafm/visualizationExecutionFull.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index ab890ffd8..5f3bb48cc 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -518,6 +518,4 @@ public ExecuteAfmService getExecuteAfmService() { public LcmService getLcmService() { return lcmService; } - - } diff --git a/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java b/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java index fba27c921..446dcf9b4 100644 --- a/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java +++ b/src/main/java/com/gooddata/executeafm/ExecuteAfmService.java @@ -22,16 +22,22 @@ import static com.gooddata.util.Validate.notNull; /** - * Service for executeAfm resource + * Service for executing reports with new visualization structures like AFM or Visualization Object. + * This includes GD API endpoints: + *

    + *
  • {@code /executeAfm}
  • + *
  • {@code /executeVisualization}
  • + *
*/ public class ExecuteAfmService extends AbstractService { - private static final String EXECUTION_URI = "/gdc/app/projects/{projectId}/executeAfm"; + private static final String AFM_EXECUTION_URI = "/gdc/app/projects/{projectId}/executeAfm"; + private static final String VISUALIZATION_EXECUTION_URI = "/gdc/app/projects/{projectId}/executeVisualization"; private static final String RESULT_OFFSET = "offset"; private static final String RESULT_LIMIT = "limit"; /** - * Service for executeAfm resource + * Constructor. * * @param restTemplate rest template * @param settings settings @@ -41,17 +47,25 @@ public ExecuteAfmService(final RestTemplate restTemplate, final GoodDataSettings } /** - * Executes the given execution returning the execution response + * @deprecated use {@link ExecuteAfmService#executeAfm(Project, Execution)} + */ + @Deprecated + public ExecutionResponse execute(final Project project, final Execution execution) { + return executeAfm(project, execution); + } + + /** + * Executes the given AFM execution returning the execution response * @param project project of the execution * @param execution execution * @return response of the submitted execution */ - public ExecutionResponse execute(final Project project, final Execution execution) { + public ExecutionResponse executeAfm(final Project project, final Execution execution) { final String projectId = notNull(notNull(project, "project").getId(), "projectId"); final ExecutionResponse response; try { response = restTemplate.postForObject( - EXECUTION_URI, + AFM_EXECUTION_URI, notNull(execution, "execution"), ExecutionResponse.class, projectId); @@ -66,6 +80,32 @@ public ExecutionResponse execute(final Project project, final Execution executio return response; } + /** + * Executes the given execution returning the execution response + * @param project project of the execution + * @param execution execution + * @return response of the submitted execution + */ + public ExecutionResponse executeVisualization(final Project project, final VisualizationExecution execution) { + final String projectId = notNull(notNull(project, "project").getId(), "projectId"); + final ExecutionResponse response; + try { + response = restTemplate.postForObject( + VISUALIZATION_EXECUTION_URI, + notNull(execution, "execution"), + ExecutionResponse.class, + projectId); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to execute visualization", e); + } + + if (response == null) { + throw new GoodDataException("Empty response when execution posted to API"); + } + + return response; + } + /** * Get for result of given response. * @param executionResponse response to get the result diff --git a/src/main/java/com/gooddata/executeafm/VisualizationExecution.java b/src/main/java/com/gooddata/executeafm/VisualizationExecution.java new file mode 100644 index 000000000..5be7ddf1e --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/VisualizationExecution.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.executeafm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.executeafm.afm.CompatibilityFilter; +import com.gooddata.executeafm.resultspec.ResultSpec; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Represents structure for triggering execution with reference to visualization object. + * Contains additional filters which should be merged with original ones defined in viz. object. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonTypeName("visualizationExecution") +public class VisualizationExecution { + + private final String reference; + private List filters; + private ResultSpec resultSpec; + + /** + * Constructor. + * Creates execution of visualization object without any additional filters or result specification. + * + * @param reference reference uri to visualization object metadata + */ + public VisualizationExecution(final String reference) { + this(reference, null, null); + } + + /** + * @param reference reference uri to visualization object metadata + * @param filters additional filters which should be merged + * @param resultSpec result specification of executed viz. object + */ + @JsonCreator + VisualizationExecution(@JsonProperty("reference") final String reference, + @JsonProperty("filters") final List filters, + @JsonProperty("resultSpec") final ResultSpec resultSpec) { + this.reference = reference; + this.resultSpec = resultSpec; + this.filters = filters; + } + + /** + * @return reference uri to visualization object metadata + */ + public String getReference() { + return reference; + } + + public List getFilters() { + return filters; + } + + /** + * Sets the result specification and returns this instance + * + * @param resultSpec result specification of executed viz. object + * @return updated execution + */ + public VisualizationExecution setResultSpec(final ResultSpec resultSpec) { + this.resultSpec = resultSpec; + return this; + } + + /** + * @return result specification of executed viz. object + */ + public ResultSpec getResultSpec() { + return resultSpec; + } + + /** + * Sets additional filters to this execution. + * + * @param filters additional filters + * @return updated execution + */ + public VisualizationExecution setFilters(final List filters) { + this.filters = filters; + return this; + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy b/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy index c5d17662e..9852e00f3 100644 --- a/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy +++ b/src/test/groovy/com/gooddata/executeafm/ExecuteAfmServiceIT.groovy @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ @@ -42,10 +42,13 @@ class ExecuteAfmServiceIT extends GoodDataITBase { Project project = readObjectFromResource('/project/project.json', Project) @Shared - Execution execution = new Execution(new Afm() + Execution afmExecution = new Execution(new Afm() .addAttribute(new AttributeItem(ATTR_QUALIFIER, 'a1')) .addMeasure(new MeasureItem(new SimpleMeasureDefinition(MEASURE_QUALIFIER), 'm1'))) + @Shared + VisualizationExecution visualizationExecution = new VisualizationExecution('/gdc/md/PROJECT_ID/obj/4') + @Shared ExecutionResponse response = new ExecutionResponse([ new ResultDimension(new AttributeHeader('name', 'a1', DF_URI, 'a1DfId', new AttributeInHeader('aName', ATTR_URI, 'a1Id'))), @@ -57,30 +60,30 @@ class ExecuteAfmServiceIT extends GoodDataITBase { onRequest() .havingMethodEqualTo('POST') .havingPathEqualTo('/gdc/app/projects/PROJECT_ID/executeAfm') - .havingBody(jsonEquals(execution)) - .respond() + .havingBody(jsonEquals(afmExecution)) + .respond() .withBody(OBJECT_MAPPER.writeValueAsString(response)) .withStatus(200) when: - ExecutionResponse executed = service.execute(project, execution) + ExecutionResponse executed = service.executeAfm(project, afmExecution) then: executed?.dimensions?.size() == 2 executed?.executionResultUri == RESULT_URI } - def "should handle failed execution request"() { + def "should handle failed AFM execution request"() { given: onRequest() .havingMethodEqualTo('POST') .havingPathEqualTo('/gdc/app/projects/PROJECT_ID/executeAfm') - .havingBody(jsonEquals(execution)) - .respond() + .havingBody(jsonEquals(afmExecution)) + .respond() .withStatus(400) when: - service.execute(project, execution) + service.executeAfm(project, afmExecution) then: def ex = thrown(GoodDataException) @@ -88,14 +91,14 @@ class ExecuteAfmServiceIT extends GoodDataITBase { } @Unroll - def "should get result #order page"() { + "should get execution result #order page"() { given: ExecutionResult result = new ExecutionResult(new String[0], new Paging([0], [0], [0])) onRequest() .respond() .withStatus(202) - .thenRespond() + .thenRespond() .withBody(OBJECT_MAPPER.writeValueAsString(result)) .withStatus(200) @@ -116,13 +119,13 @@ class ExecuteAfmServiceIT extends GoodDataITBase { } @Unroll - def "should handle failed result with status #statusCode"() { + "should handle failed result with status #statusCode"() { given: onRequest() .havingMethodEqualTo('GET') .havingPathEqualTo(RESULT_PATH) .havingQueryStringEqualTo(RESULT_QUERY) - .respond() + .respond() .withStatus(statusCode) when: @@ -141,6 +144,41 @@ class ExecuteAfmServiceIT extends GoodDataITBase { } + def "should execute visualization object"() { + given: + onRequest() + .havingMethodEqualTo('POST') + .havingPathEqualTo('/gdc/app/projects/PROJECT_ID/executeVisualization') + .havingBody(jsonEquals(visualizationExecution)) + .respond() + .withBody(OBJECT_MAPPER.writeValueAsString(response)) + .withStatus(200) + + when: + ExecutionResponse executed = service.executeVisualization(project, visualizationExecution) + + then: + executed?.dimensions?.size() == 2 + executed?.executionResultUri == RESULT_URI + } + + def "should handle failed visualization execution request"() { + given: + onRequest() + .havingMethodEqualTo('POST') + .havingPathEqualTo('/gdc/app/projects/PROJECT_ID/executeVisualization') + .havingBody(jsonEquals(visualizationExecution)) + .respond() + .withStatus(400) + + when: + service.executeVisualization(project, visualizationExecution) + + then: + def ex = thrown(GoodDataException) + ex.message == 'Unable to execute visualization' + } + @Override protected ExecuteAfmService getService() { return gd.executeAfmService diff --git a/src/test/groovy/com/gooddata/executeafm/VisualizationExecutionTest.groovy b/src/test/groovy/com/gooddata/executeafm/VisualizationExecutionTest.groovy new file mode 100644 index 000000000..b2819913d --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/VisualizationExecutionTest.groovy @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.executeafm + +import com.gooddata.executeafm.afm.ExpressionFilter +import com.gooddata.executeafm.resultspec.AttributeSortItem +import com.gooddata.executeafm.resultspec.Dimension +import com.gooddata.executeafm.resultspec.ResultSpec +import com.gooddata.executeafm.resultspec.TotalItem +import com.gooddata.md.report.Total +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + + +class VisualizationExecutionTest extends Specification { + + static final String VIZ_EXECUTION_JSON = 'executeafm/visualizationExecution.json' + static final String VIZ_EXECUTION_FULL_JSON = 'executeafm/visualizationExecutionFull.json' + + def "should deserialize with reference only"() { + when: + def execution = readObjectFromResource("/$VIZ_EXECUTION_JSON", VisualizationExecution) + + then: + execution?.reference == '/gdc/md/PROJECT/vizObjUri' + !execution?.filters + !execution?.resultSpec + } + + def "should serialize"() { + expect: + that new VisualizationExecution( + '/gdc/md/PROJECT/vizObjUri', + [new ExpressionFilter('some expression')], + new ResultSpec([new Dimension(['i1'], [new TotalItem('mId', Total.AVG, 'a1')].toSet())], + [new AttributeSortItem('asc', 'aId')]) + ), jsonEquals(resource(VIZ_EXECUTION_FULL_JSON)) + } + + def "should deserialize"() { + when: + def execution = readObjectFromResource("/$VIZ_EXECUTION_FULL_JSON", VisualizationExecution) + + then: + execution?.reference == '/gdc/md/PROJECT/vizObjUri' + execution?.filters?.every { it.class == ExpressionFilter && it.value == 'some expression' } + execution?.resultSpec?.sorts?.every { it instanceof AttributeSortItem && it.attributeIdentifier == 'aId' } + execution?.resultSpec?.dimensions?.every { it.itemIdentifiers == ['i1'] && it.totals*.measureIdentifier == ['mId'] } + } +} diff --git a/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java b/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java index ad7eb1cf2..0f9b72a4b 100644 --- a/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java +++ b/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java @@ -44,7 +44,7 @@ public void testExecuteAfm() { .addMeasure(new MeasureItem(new SimpleMeasureDefinition(new UriObjQualifier(metric.getUri())), "m1")) ); - response = gd.getExecuteAfmService().execute(project, execution); + response = gd.getExecuteAfmService().executeAfm(project, execution); assertThat(response, notNullValue()); assertThat("should have 2 dimensions", response.getDimensions(), hasSize(2)); diff --git a/src/test/resources/executeafm/visualizationExecution.json b/src/test/resources/executeafm/visualizationExecution.json new file mode 100644 index 000000000..dadf314de --- /dev/null +++ b/src/test/resources/executeafm/visualizationExecution.json @@ -0,0 +1,5 @@ +{ + "visualizationExecution": { + "reference": "/gdc/md/PROJECT/vizObjUri" + } +} \ No newline at end of file diff --git a/src/test/resources/executeafm/visualizationExecutionFull.json b/src/test/resources/executeafm/visualizationExecutionFull.json new file mode 100644 index 000000000..a1eb34aec --- /dev/null +++ b/src/test/resources/executeafm/visualizationExecutionFull.json @@ -0,0 +1,36 @@ +{ + "visualizationExecution": { + "reference": "/gdc/md/PROJECT/vizObjUri", + "filters": [ + { + "expression": { + "value": "some expression" + } + } + ], + "resultSpec": { + "dimensions": [ + { + "itemIdentifiers": [ + "i1" + ], + "totals": [ + { + "measureIdentifier": "mId", + "type": "avg", + "attributeIdentifier": "a1" + } + ] + } + ], + "sorts": [ + { + "attributeSortItem": { + "attributeIdentifier": "aId", + "direction": "asc" + } + } + ] + } + } +} \ No newline at end of file From cfcfbd0892b28df6f9b2ca451f6ab64d57ad61ff Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 9 Apr 2018 14:45:10 +0200 Subject: [PATCH 054/548] make AFM and ResultSpec conversion methods in VisualizationConverter public --- .../visualization/VisualizationConverter.java | 44 +++++++++++-------- .../md/visualization/VisualizationObject.java | 21 +++++++++ ...oovy => VisualizationConverterTest.groovy} | 10 +++-- 3 files changed, 54 insertions(+), 21 deletions(-) rename src/test/groovy/com/gooddata/md/visualization/{VisualizationObjectConverterTest.groovy => VisualizationConverterTest.groovy} (93%) diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java index dbe23dfe7..ed0756b8e 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java @@ -18,16 +18,11 @@ import com.gooddata.executeafm.afm.NegativeAttributeFilter; import com.gooddata.executeafm.afm.PositiveAttributeFilter; import com.gooddata.executeafm.afm.SimpleMeasureDefinition; -import com.gooddata.executeafm.resultspec.AttributeSortItem; import com.gooddata.executeafm.resultspec.Dimension; -import com.gooddata.executeafm.resultspec.Direction; -import com.gooddata.executeafm.resultspec.MeasureLocatorItem; -import com.gooddata.executeafm.resultspec.MeasureSortItem; import com.gooddata.executeafm.resultspec.ResultSpec; import com.gooddata.executeafm.resultspec.SortItem; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -47,22 +42,28 @@ public abstract class VisualizationConverter { private static final ObjectMapper MAPPER = new ObjectMapper(); /** - * Generate Execution from Visualization object. Currently {@link ResultSpec}'s {@link Dimension}s can be generated - * for table and four types of chart: bar, column, line and pie. + * Generate Execution from Visualization object. * * @param visualizationObject which will be converted to {@link Execution} * @param visualizationClassGetter {@link Function} for fetching VisualizationClass, which is necessary for correct generation of {@link ResultSpec} * @return {@link Execution} object + * + * @see #convertToAfm(VisualizationObject) + * @see #convertToResultSpec(VisualizationObject, Function) */ public static Execution convertToExecution(final VisualizationObject visualizationObject, final Function visualizationClassGetter) { - VisualizationClass visualizationClass = notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri()); - - ResultSpec resultSpec = convertToResultSpec(visualizationObject, visualizationClass.getVisualizationType()); + ResultSpec resultSpec = convertToResultSpec(visualizationObject, visualizationClassGetter); Afm afm = convertToAfm(visualizationObject); return new Execution(afm, resultSpec); } - static Afm convertToAfm(final VisualizationObject visualizationObject) { + /** + * Generate Afm from Visualization object. + * + * @param visualizationObject which will be converted to {@link Execution} + * @return {@link Afm} object + */ + public static Afm convertToAfm(final VisualizationObject visualizationObject) { final List attributes = convertAttributes(visualizationObject.getAttributes()); final List filters = convertFilters(visualizationObject.getFilters()); final List measures = convertMeasures(visualizationObject.getMeasures()); @@ -70,12 +71,20 @@ static Afm convertToAfm(final VisualizationObject visualizationObject) { return new Afm(attributes, filters, measures, null); } - static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, - final VisualizationType visualizationType) { - notNull(visualizationObject); - notNull(visualizationType); + /** + * Generate ResultSpec from Visualization object. Currently {@link ResultSpec}'s {@link Dimension}s can be generated + * for table and four types of chart: bar, column, line and pie. + * + * @param visualizationObject which will be converted to {@link Execution} + * @param visualizationClassGetter {@link Function} for fetching VisualizationClass, which is necessary for correct generation of {@link ResultSpec} + * @return {@link Execution} object + */ + public static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, + final Function visualizationClassGetter) { + VisualizationClass visualizationClass = notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri()); + List sorts = getSorting(visualizationObject); - List dimensions = getDimensions(visualizationObject, visualizationType); + List dimensions = getDimensions(visualizationObject, visualizationClass.getVisualizationType()); return new ResultSpec(dimensions, sorts); } @@ -206,12 +215,11 @@ private static List convertFilters(final List f } private static List convertMeasures(final List measures) { - List measuresForAfm = measures.stream() + return measures.stream() .map(VisualizationConverter::removeFormat) .map(VisualizationConverter::getAfmMeasure) .map(VisualizationConverter::convertMeasureFilters) .collect(toList()); - return measuresForAfm; } private static Measure removeFormat(final Measure measure) { diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java index cd3ae2b09..bd1eb5eff 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java @@ -19,8 +19,10 @@ import static org.apache.commons.lang3.Validate.notNull; import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.executeafm.afm.Afm; import com.gooddata.executeafm.afm.FilterItem; import com.gooddata.executeafm.Execution; +import com.gooddata.executeafm.resultspec.ResultSpec; import com.gooddata.md.AbstractObj; import com.gooddata.md.Meta; import com.gooddata.md.Queryable; @@ -255,11 +257,30 @@ public void setVisualizationClass(UriObjQualifier uri) { content.setVisualizationClass(uri); } + /** + * @see VisualizationConverter#convertToExecution(VisualizationObject, Function) + */ @JsonIgnore public Execution convertToExecution(Function visualizationClassgetter) { return VisualizationConverter.convertToExecution(this, visualizationClassgetter); } + /** + * @see VisualizationConverter#convertToAfm(VisualizationObject) + */ + @JsonIgnore + public Afm convertToAfm() { + return VisualizationConverter.convertToAfm(this); + } + + /** + * @see VisualizationConverter#convertToResultSpec(VisualizationObject, Function) + */ + @JsonIgnore + public ResultSpec convertToResultSpec(Function visualizationClassgetter) { + return VisualizationConverter.convertToResultSpec(this, visualizationClassgetter); + } + private Content getContent() { return content; } diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy similarity index 93% rename from src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy rename to src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy index a47b81f54..66dbd5df6 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectConverterTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy @@ -24,6 +24,8 @@ import com.gooddata.executeafm.resultspec.ResultSpec import com.gooddata.executeafm.resultspec.SortItem import spock.lang.Unroll +import java.util.function.Function + import static VisualizationConverter.convertToAfm import static VisualizationConverter.convertToResultSpec import static VisualizationConverter.parseSorting @@ -31,7 +33,7 @@ import static com.gooddata.util.ResourceUtils.readObjectFromResource import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals import static spock.util.matcher.HamcrestSupport.that -class VisualizationObjectConverterTest extends Specification { +class VisualizationConverterTest extends Specification { private static final String COMPLEX_VISUALIZATION = "md/visualization/complexVisualizationObject.json" private static final String SIMPLE_VISUALIZATION = "md/visualization/simpleVisualizationObject.json" @@ -83,8 +85,9 @@ class VisualizationObjectConverterTest extends Specification { @Unroll def "should generate result spec for table with default sorting from #name"() { given: + Function getter = { vizObject -> Stub(VisualizationClass) { getVisualizationType() >> VisualizationType.TABLE } } VisualizationObject vo = readObjectFromResource("/$resource", VisualizationObject) - ResultSpec converted = convertToResultSpec(vo, VisualizationType.TABLE) + ResultSpec converted = convertToResultSpec(vo, getter) expect: that converted, jsonEquals(expected) @@ -104,8 +107,9 @@ class VisualizationObjectConverterTest extends Specification { @Unroll def "should generate result spec for #type"() { given: + Function getter = { vizObject -> Stub(VisualizationClass) { getVisualizationType() >> VisualizationType.of(type) } } VisualizationObject vo = readObjectFromResource("/$resource", VisualizationObject) - ResultSpec converted = convertToResultSpec(vo, VisualizationType.of(type)) + ResultSpec converted = convertToResultSpec(vo, getter) expect: that converted, jsonEquals(expected) From ff8ced505f6c51c00f990695f973d12207f794ba Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 10 Apr 2018 09:32:50 +0200 Subject: [PATCH 055/548] add equals and hashcode to AFM ExpressionFilter --- .../executeafm/afm/ExpressionFilter.java | 23 ++++++++++++++++--- .../afm/ExpressionFilterTest.groovy | 8 ++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java b/src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java index f2a02c627..615fa3b04 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ @@ -10,11 +10,13 @@ import com.fasterxml.jackson.annotation.JsonRootName; import com.gooddata.util.GoodDataToStringBuilder; +import java.util.Objects; + /** * To be deprecated filter using plain expression */ @JsonRootName("expression") -public class ExpressionFilter implements CompatibilityFilter { +public final class ExpressionFilter implements CompatibilityFilter { static final String NAME = "expression"; private final String value; @@ -27,7 +29,7 @@ public ExpressionFilter(@JsonProperty("value") final String value) { this.value = value; } - public String getValue() { + public String getValue() { return value; } @@ -35,4 +37,19 @@ public String getValue() { public String toString() { return GoodDataToStringBuilder.defaultToString(this); } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof ExpressionFilter)) + return false; + ExpressionFilter that = (ExpressionFilter) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/ExpressionFilterTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/ExpressionFilterTest.groovy index f2dd8bed3..59c13d0c6 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/ExpressionFilterTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/ExpressionFilterTest.groovy @@ -1,10 +1,11 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.executeafm.afm +import nl.jqno.equalsverifier.EqualsVerifier import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource @@ -29,4 +30,9 @@ class ExpressionFilterTest extends Specification { filter.value == 'some expression' filter.toString() } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(ExpressionFilter).verify() + } } From af728a796fbb09b93dc1b4fd74630d9d2b07b188 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 10 Apr 2018 11:07:17 +0200 Subject: [PATCH 056/548] [maven-release-plugin] prepare release gooddata-java-2.23.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c7504310d..55b65d4b9 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.22.1-SNAPSHOT + 2.23.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.23.0 From 87f937aaf269e6c3d5f162af24b10754c38c96ec Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 10 Apr 2018 11:07:17 +0200 Subject: [PATCH 057/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 55b65d4b9..f98d1ed03 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.23.0 + 2.23.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.23.0 + HEAD From f99d8901d36351db1d8790710bcc13a7e0813c1a Mon Sep 17 00:00:00 2001 From: xMort Date: Wed, 4 Apr 2018 08:39:59 +0200 Subject: [PATCH 058/548] Introduce support for offset in PoP measure --- .../executeafm/afm/PopMeasureDefinition.java | 52 ++++++++++++++++--- .../visualization/VOPopMeasureDefinition.java | 27 ++++++++-- .../afm/PopMeasureDefinitionTest.groovy | 43 +++++++++++---- .../executeafm/afm/popMeasureDefinition.json | 2 +- .../afm/popMeasureDefinitionWithOffset.json | 9 ++++ 5 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java index b6dfcbf62..91c2daa5f 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java @@ -1,10 +1,12 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.executeafm.afm; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; import com.gooddata.executeafm.ObjQualifier; @@ -12,7 +14,6 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; -import java.util.Objects; import static com.gooddata.executeafm.afm.PopMeasureDefinition.NAME; @@ -20,6 +21,7 @@ * Definition of so called "period over period" measure */ @JsonRootName(NAME) +@JsonInclude(JsonInclude.Include.NON_NULL) public class PopMeasureDefinition implements MeasureDefinition, Serializable { private static final long serialVersionUID = 1430640153994197345L; @@ -29,21 +31,46 @@ public class PopMeasureDefinition implements MeasureDefinition, Serializable { private final ObjQualifier popAttribute; + private final Integer offset; + /** - * Creates new definition from given measure identifier referencing another measure in {@link Afm} and given - * attribute qualifier (should qualify date attribute) - * @param measureIdentifier measure identifier - * @param popAttribute "period over period" date attribute + * Creates new definition from given measure identifier referencing another measure in {@link Afm} and given attribute qualifier (should qualify date + * attribute) + * + * @param measureIdentifier + * measure identifier + * @param popAttribute + * "period over period" date attribute + * @param offset + * the number of periods the time window defined by {@code popAttribute} is offset about to the past (when value is negative) or future (when + * value is positive) */ + @JsonCreator public PopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier, - @JsonProperty("popAttribute") final ObjQualifier popAttribute) { + @JsonProperty("popAttribute") final ObjQualifier popAttribute, + @JsonProperty("offset") final Integer offset) { this.measureIdentifier = measureIdentifier; this.popAttribute = popAttribute; + this.offset = offset; + } + + /** + * Creates new definition from given measure identifier referencing another measure in {@link Afm} and given attribute qualifier (should qualify date + * attribute) + * + * @param measureIdentifier + * measure identifier + * @param popAttribute + * "period over period" date attribute + */ + public PopMeasureDefinition(final String measureIdentifier, + final ObjQualifier popAttribute) { + this(measureIdentifier, popAttribute, null); } @Override public MeasureDefinition withObjUriQualifier(final UriObjQualifier qualifier) { - return new PopMeasureDefinition(measureIdentifier, qualifier); + return new PopMeasureDefinition(measureIdentifier, qualifier, offset); } /** @@ -62,6 +89,15 @@ public ObjQualifier getPopAttribute() { return popAttribute; } + /** + * Returns number of periods defined via {@link #popAttribute} time interval. + * + * @return positive or negative number of periods or {@code null} when offset was not defined + */ + public Integer getOffset() { + return offset; + } + @Override public ObjQualifier getObjQualifier() { return getPopAttribute(); diff --git a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java b/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java index 4deb73672..f031bcd16 100644 --- a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java +++ b/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java @@ -15,6 +15,7 @@ /** * Period over Period measure definition to be used within {@link Measure} + * * @deprecated identical with {@link com.gooddata.executeafm.afm.PopMeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 */ @Deprecated @@ -27,12 +28,32 @@ public class VOPopMeasureDefinition extends com.gooddata.executeafm.afm.PopMeasu /** * Creates instance of Period over Period measure definition to be used in {@link VisualizationObject} - * @param measureIdentifier reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated - * @param popAttribute uri to attribute used for PoP + * + * @param measureIdentifier + * reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated + * @param popAttribute + * uri to attribute used for PoP + * @param offset + * the number of periods defined via the {@code popAttribute} time interval to the past (when value is negative) or to the future (when + * value is positive) */ @JsonCreator public VOPopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier, - @JsonProperty("popAttribute") final ObjQualifier popAttribute) { + @JsonProperty("popAttribute") final ObjQualifier popAttribute, + @JsonProperty("offset") final Integer offset) { + super(measureIdentifier, popAttribute, offset); + } + + /** + * Creates instance of Period over Period measure definition to be used in {@link VisualizationObject} + * + * @param measureIdentifier + * reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated + * @param popAttribute + * uri to attribute used for PoP + */ + public VOPopMeasureDefinition(final String measureIdentifier, + final ObjQualifier popAttribute) { super(measureIdentifier, popAttribute); } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy index c7a612730..c1c8ef847 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ @@ -17,39 +17,64 @@ import static spock.util.matcher.HamcrestSupport.that class PopMeasureDefinitionTest extends Specification { - private static final String POP_MEASURE_DEFINITION_JSON = 'executeafm/afm/popMeasureDefinition.json' + private static final String POP_MEASURE_JSON = 'executeafm/afm/popMeasureDefinition.json' + private static final String POP_MEASURE_WITH_OFFSET_JSON = 'executeafm/afm/popMeasureDefinitionWithOffset.json' + def "should serialize"() { expect: - that new PopMeasureDefinition('mId', new UriObjQualifier('/gdc/md/projectId/obj/1')), - jsonEquals(resource(POP_MEASURE_DEFINITION_JSON)) + that new PopMeasureDefinition('mId', new UriObjQualifier('/gdc/md/projectId/obj/1'), offset), + jsonEquals(resource(expectedJsonMeasureDefinition)) + + where: + offset | expectedJsonMeasureDefinition + null | POP_MEASURE_JSON + -2 | POP_MEASURE_WITH_OFFSET_JSON } def "should deserialize"() { when: - PopMeasureDefinition measure = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition) + PopMeasureDefinition measure = readObjectFromResource("/$jsonMeasureDefinition", PopMeasureDefinition) then: measure.measureIdentifier == 'mId' - (measure.popAttribute as UriObjQualifier).uri == '/gdc/md/projectId/obj/1' + (measure.popAttribute as UriObjQualifier).uri == '/gdc/md/projectId/obj/1' measure.isAdHoc() measure.toString() + measure.offset == expectedOffset + + where: + jsonMeasureDefinition | expectedOffset + POP_MEASURE_JSON | null + POP_MEASURE_WITH_OFFSET_JSON | -2 } def "should copy"() { when: - def measure = new PopMeasureDefinition("mid", new IdentifierObjQualifier("id")) + def measure = new PopMeasureDefinition("mId", new IdentifierObjQualifier("id"), inputOffset) def copy = measure.withObjUriQualifier(new UriObjQualifier("uri")) then: + copy.measureIdentifier == 'mId' copy.objQualifier.uri == 'uri' + copy.offset == expectedOffset + + where: + inputOffset | expectedOffset + null | null + -2 | -2 } def "test serializable"() { - PopMeasureDefinition measureDefinition = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition) + when: + PopMeasureDefinition measureDefinition = readObjectFromResource("/$jsonMeasureDefinition", PopMeasureDefinition) PopMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) - expect: + then: that deserialized, jsonEquals(measureDefinition) + + where: + jsonMeasureDefinition << [POP_MEASURE_JSON, POP_MEASURE_WITH_OFFSET_JSON] } + } diff --git a/src/test/resources/executeafm/afm/popMeasureDefinition.json b/src/test/resources/executeafm/afm/popMeasureDefinition.json index 1b6472b2d..cc35774fc 100644 --- a/src/test/resources/executeafm/afm/popMeasureDefinition.json +++ b/src/test/resources/executeafm/afm/popMeasureDefinition.json @@ -5,4 +5,4 @@ "uri": "/gdc/md/projectId/obj/1" } } -} \ No newline at end of file +} diff --git a/src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json b/src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json new file mode 100644 index 000000000..adb5f1ae7 --- /dev/null +++ b/src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json @@ -0,0 +1,9 @@ +{ + "popMeasure": { + "measureIdentifier": "mId", + "popAttribute": { + "uri": "/gdc/md/projectId/obj/1" + }, + "offset": -2 + } +} From 251d38cd5c23786545fbc90c3a665bf3a747e836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Fri, 13 Apr 2018 10:52:18 +0200 Subject: [PATCH 059/548] bump version --- README.md | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2b3118152..e0fb845c2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.22.0 + 2.24.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, diff --git a/pom.xml b/pom.xml index f98d1ed03..277f02f98 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.23.1-SNAPSHOT + 2.24.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.24.0 From f0dfc5bb29401d7e69f50030445c47c4b399ffe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Fri, 13 Apr 2018 10:54:36 +0200 Subject: [PATCH 060/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 277f02f98..0c4fbfb23 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.24.0 + 2.24.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.24.0 + HEAD From cf5b5ca51fef12f2302eb851051d867722046aac Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 13 Apr 2018 14:28:49 +0200 Subject: [PATCH 061/548] support irregular query type plurals in find by query resource --- .../java/com/gooddata/md/MetadataService.java | 67 ++++++++++++------- .../com/gooddata/md/MetadataServiceTest.java | 32 ++++++--- 2 files changed, 65 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 91e098747..a32d9868f 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -19,8 +19,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import static com.gooddata.util.Validate.noNullElements; @@ -32,6 +34,8 @@ */ public class MetadataService extends AbstractService { + private static final Set IRREGULAR_PLURAL_WORD_SUFFIXES = new HashSet<>(asList("s", "ch", "sh", "x", "o")); + public MetadataService(final RestTemplate restTemplate, final GoodDataSettings settings) { super(restTemplate, settings); } @@ -278,8 +282,7 @@ public Collection find(Project project, Class cl notNull(project.getId(), "project.id"); notNull(cls, "cls"); - final String type = cls.getSimpleName().toLowerCase() + - (cls.isAssignableFrom(ReportDefinition.class) ? "" : "s"); + final String type = getQueryType(cls); try { final Query queryResult = restTemplate.getForObject(Query.URI, Query.class, project.getId(), type); @@ -293,29 +296,6 @@ public Collection find(Project project, Class cl } } - private Collection filterEntries(Collection entries, Restriction... restrictions) { - if (restrictions == null || restrictions.length == 0) { - return entries; - } - final Collection result = new ArrayList<>(entries.size()); - for (Entry entry : entries) { - for (Restriction restriction : restrictions) { - switch (restriction.getType()) { - case IDENTIFIER: - if (restriction.getValue().equals(entry.getIdentifier())) result.add(entry); - break; - case TITLE: - if (restriction.getValue().equals(entry.getTitle())) result.add(entry); - break; - case SUMMARY: - if (restriction.getValue().equals(entry.getSummary())) result.add(entry); - break; - } - } - } - return result; - } - /** * Find metadata URIs by restrictions like identifier, title or summary. * @@ -470,6 +450,29 @@ public List getAttributeElements(DisplayForm displayForm) { } } + private Collection filterEntries(Collection entries, Restriction... restrictions) { + if (restrictions == null || restrictions.length == 0) { + return entries; + } + final Collection result = new ArrayList<>(entries.size()); + for (Entry entry : entries) { + for (Restriction restriction : restrictions) { + switch (restriction.getType()) { + case IDENTIFIER: + if (restriction.getValue().equals(entry.getIdentifier())) result.add(entry); + break; + case TITLE: + if (restriction.getValue().equals(entry.getTitle())) result.add(entry); + break; + case SUMMARY: + if (restriction.getValue().equals(entry.getSummary())) result.add(entry); + break; + } + } + } + return result; + } + private IdentifiersAndUris getUrisForIdentifiers(final Project project, final Collection identifiers) { final IdentifiersAndUris response; try { @@ -479,4 +482,18 @@ private IdentifiersAndUris getUrisForIdentifiers(final Project project, final Co } return response; } + + private String getQueryType(final Class cls) { + final String typeBase = cls.getSimpleName().toLowerCase(); + + if (ReportDefinition.class.equals(cls)) { + return typeBase; + } + + if (IRREGULAR_PLURAL_WORD_SUFFIXES.stream().anyMatch(typeBase::endsWith)) { + return typeBase + "es"; + } + + return typeBase + "s"; + } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 3cc9678a6..71eb7fad5 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -10,6 +10,7 @@ import com.gooddata.GoodDataSettings; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; +import com.gooddata.md.visualization.VisualizationClass; import com.gooddata.project.Project; import org.mockito.Matchers; import org.mockito.Mock; @@ -32,6 +33,8 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -276,7 +279,7 @@ public void testGetObjUriToFindOneObjByTitle() throws Exception { final Entry resultEntry = mock(Entry.class); final String uri = "myURI"; final String title = "myTitle"; - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); when(resultEntry.getTitle()).thenReturn(title); when(resultEntry.getUri()).thenReturn(uri); @@ -290,7 +293,7 @@ public void testGetObjUriMoreThanOneResult() throws Exception { final Query queryResult = mock(Query.class); final Entry resultEntry1 = mock(Entry.class); final Entry resultEntry2 = mock(Entry.class); - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); service.getObjUri(project, Queryable.class); @@ -301,7 +304,7 @@ public void testGetObjUriNothingFound() throws Exception { final Query queryResult = mock(Query.class); final Entry resultEntry = mock(Entry.class); final String title = "myTitle"; - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); service.getObjUri(project, Queryable.class, Restriction.title(title)); @@ -314,7 +317,7 @@ public void testGetObjToFindOneObjById() throws Exception { final Entry resultEntry = mock(Entry.class); final String uri = "myURI"; final String id = "myId"; - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); when(resultEntry.getIdentifier()).thenReturn(id); when(resultEntry.getUri()).thenReturn(uri); @@ -329,7 +332,7 @@ public void testGetObjMoreThanOneResult() throws Exception { final Query queryResult = mock(Query.class); final Entry resultEntry1 = mock(Entry.class); final Entry resultEntry2 = mock(Entry.class); - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); service.getObj(project, Queryable.class); @@ -340,7 +343,7 @@ public void testGetObjNothingFound() throws Exception { final Query queryResult = mock(Query.class); final Entry resultEntry = mock(Entry.class); final String title = "myTitle"; - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); service.getObj(project, Queryable.class, Restriction.title(title)); @@ -351,16 +354,27 @@ public void testFindMoreResults() throws Exception { final Query queryResult = mock(Query.class); final Entry resultEntry1 = mock(Entry.class); final Entry resultEntry2 = mock(Entry.class); - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); final Collection results = service.find(project, Queryable.class); assertThat(results, allOf(hasItem(resultEntry1), hasItem(resultEntry2))); } + @Test + public void testFindIrregularQueryTypeNames() { + when(restTemplate.getForObject(anyString(), any(), anyString(), anyString())).thenReturn(mock(Query.class)); + + service.find(project, ReportDefinition.class); + verify(restTemplate).getForObject(Query.URI, Query.class, project.getId(), "reportdefinition"); + + service.find(project, VisualizationClass.class); + verify(restTemplate).getForObject(Query.URI, Query.class, project.getId(), "visualizationclasses"); + } + @Test(expectedExceptions = GoodDataException.class) public void testFindWithWithClientSideHTTPError() throws Exception { - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenThrow(new RestClientException("")); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenThrow(new RestClientException("")); service.find(project, Queryable.class); } @@ -372,7 +386,7 @@ public void testFindUrisBySummary() throws Exception { final String summary = "mySummary"; final String uri1 = "uri1"; final String uri2 = "uri2"; - when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); when(resultEntry1.getSummary()).thenReturn(summary); when(resultEntry2.getSummary()).thenReturn(summary); From 0cf05332e1df4bcbf87425f479d179cb76665740 Mon Sep 17 00:00:00 2001 From: Richard Benkovsky Date: Tue, 17 Apr 2018 09:51:30 +0200 Subject: [PATCH 062/548] Introduce functionality for data deletion during ETL --- .../com/gooddata/dataset/DatasetManifest.java | 2 +- .../java/com/gooddata/dataset/UploadMode.java | 56 ++++++++++++++++++- .../gooddata/dataset/DatasetManifestTest.java | 12 ++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 49c377660..47c0f99c9 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -91,7 +91,7 @@ public void setFile(String file) { public void setUploadMode(final UploadMode uploadMode) { notNull(uploadMode, "uploadMode"); for (Part part : parts) { - part.setUploadMode(uploadMode.name()); + part.setUploadMode(uploadMode.toString()); } } diff --git a/src/main/java/com/gooddata/dataset/UploadMode.java b/src/main/java/com/gooddata/dataset/UploadMode.java index a1c58fbf9..38bf84500 100644 --- a/src/main/java/com/gooddata/dataset/UploadMode.java +++ b/src/main/java/com/gooddata/dataset/UploadMode.java @@ -5,6 +5,60 @@ */ package com.gooddata.dataset; +import java.util.HashMap; +import java.util.Map; + +/** + * Upload modes enum. + */ public enum UploadMode { - INCREMENTAL, FULL + /** + * Dataset input for loading in full mode (reload from scratch) + */ + FULL("FULL"), + /** + * Dataset input for loading data incrementally + */ + INCREMENTAL("INCREMENTAL"), + /** + * Dataset input for loading data by calculating based on its attributes. + * Example: last sync, max timestamp, having timestamp field,... + */ + DEFAULT("DEFAULT"), + /** + * Dataset input for deleting + */ + DELETE_CENTER("DELETE-CENTER"); + + private static final Map lookup = new HashMap<>(); + + static { + for (UploadMode m : UploadMode.values()) { + lookup.put(m.modeStr, m); + } + } + + private final String modeStr; + + /** + * @param modeStr string representation of the upload mode + */ + UploadMode(final String modeStr) { + this.modeStr = modeStr; + } + + /** + * Lookup method. + * + * @param mode a string value passed in the constructor + * @return UploadMode enum instance according to the given mode string + */ + public static UploadMode get(String mode) { + return lookup.get(mode); + } + + @Override + public String toString() { + return this.modeStr; + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index b8e55f855..840a8a788 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -61,6 +61,18 @@ public void shouldSetUploadModeForAllParts() throws Exception { assertThat(manifest.getParts().get(1).getUploadMode(), is("INCREMENTAL")); } + @Test + public void shouldSetUploadModeDeleteForAllParts() throws Exception { + final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( + new DatasetManifest.Part("FULL", "col1", asList("attr1"), true, null), + new DatasetManifest.Part("FULL", "col2", asList("attr2"), true, null) + )); + manifest.setUploadMode(UploadMode.DELETE_CENTER); + + assertThat(manifest.getParts().get(0).getUploadMode(), is("DELETE-CENTER")); + assertThat(manifest.getParts().get(1).getUploadMode(), is("DELETE-CENTER")); + } + @Test public void shouldSetMapping() throws Exception { final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( From 2e20960729e3ba138ece1c9849682cfbcc2a1899 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 17 Apr 2018 11:40:30 +0200 Subject: [PATCH 063/548] [maven-release-plugin] prepare release gooddata-java-2.25.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0c4fbfb23..311124352 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.24.1-SNAPSHOT + 2.25.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.25.0 From aa00b4ebefc0b80600cfef53983da3a2e8931dbf Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 17 Apr 2018 11:40:30 +0200 Subject: [PATCH 064/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 311124352..938c05e3e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.25.0 + 2.25.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.25.0 + HEAD From 1357c52e55e2ab3a86127e4b4ad5b3e895040994 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Wed, 11 Apr 2018 17:46:33 +0200 Subject: [PATCH 065/548] add ability to set up and persist visualization object --- .../gooddata/executeafm/afm/DateFilter.java | 2 + .../gooddata/md/visualization/Measure.java | 10 +- .../VOSimpleMeasureDefinition.java | 28 ++++ .../visualization/VisualizationAttribute.java | 14 +- .../md/visualization/VisualizationObject.java | 53 +++++-- .../afm/SimpleMeasureDefinitionTest.groovy | 16 +- .../md/visualization/MeasureTest.groovy | 8 + .../VisualizationAttributeTest.groovy | 42 +++++ .../VisualizationObjectTest.groovy | 144 +++++++++--------- .../afm/simpleMeasureDefinitionFull.json | 10 ++ .../md/visualization/simpleMeasure.json | 12 ++ .../visualization/visualizationAttribute.json | 8 + .../visualizationAttributeFull.json | 9 ++ 13 files changed, 264 insertions(+), 92 deletions(-) create mode 100644 src/test/groovy/com/gooddata/md/visualization/VisualizationAttributeTest.groovy create mode 100644 src/test/resources/md/visualization/simpleMeasure.json create mode 100644 src/test/resources/md/visualization/visualizationAttribute.json create mode 100644 src/test/resources/md/visualization/visualizationAttributeFull.json diff --git a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java b/src/main/java/com/gooddata/executeafm/afm/DateFilter.java index ca545a364..3d33dd23c 100644 --- a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java +++ b/src/main/java/com/gooddata/executeafm/afm/DateFilter.java @@ -5,6 +5,7 @@ */ package com.gooddata.executeafm.afm; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.executeafm.ObjQualifier; @@ -16,6 +17,7 @@ /** * Represents filter by date. */ +@JsonInclude(JsonInclude.Include.NON_NULL) public abstract class DateFilter implements FilterItem, Serializable { private static final long serialVersionUID = -804172518160419510L; diff --git a/src/main/java/com/gooddata/md/visualization/Measure.java b/src/main/java/com/gooddata/md/visualization/Measure.java index 55181f786..3d28a93b0 100644 --- a/src/main/java/com/gooddata/md/visualization/Measure.java +++ b/src/main/java/com/gooddata/md/visualization/Measure.java @@ -11,7 +11,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.executeafm.afm.MeasureDefinition; import com.gooddata.executeafm.afm.MeasureItem; -import com.gooddata.executeafm.afm.PopMeasureDefinition; import java.util.Objects; @@ -26,6 +25,15 @@ public class Measure extends MeasureItem implements BucketItem { private String title; + /** + * Creates new instance of measure for use in {@link VisualizationObject} + * @param definition measure definition + * @param localIdentifier local identifier + */ + public Measure(final MeasureDefinition definition, final String localIdentifier) { + super(definition, localIdentifier); + } + /** * Creates new instance of measure for use in {@link VisualizationObject} * @param definition measure definition diff --git a/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java b/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java index 520ac6c40..ce8f9c83c 100644 --- a/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java +++ b/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.afm.Aggregation; import com.gooddata.executeafm.afm.FilterItem; import java.util.List; @@ -28,6 +29,15 @@ public class VOSimpleMeasureDefinition extends com.gooddata.executeafm.afm.Simpl private static final long serialVersionUID = 8467311354259963694L; public static final String NAME = "measureDefinition"; + /** + * Creates instance of simple measure definition to be used in {@link VisualizationObject} + * + * @see com.gooddata.executeafm.afm.SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier) + */ + public VOSimpleMeasureDefinition(ObjQualifier item) { + super(item); + } + /** * Creates instance of simple measure definition to be used in {@link VisualizationObject} * @param item uri to measure @@ -42,4 +52,22 @@ public VOSimpleMeasureDefinition(@JsonProperty("item") final ObjQualifier item, @JsonProperty("filters") final List filters) { super(item, aggregation, computeRatio, filters); } + + /** + * Creates instance of simple measure definition to be used in {@link VisualizationObject} + * + * @see com.gooddata.executeafm.afm.SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier, Aggregation, Boolean, List) + */ + public VOSimpleMeasureDefinition(ObjQualifier item, Aggregation aggregation, Boolean computeRatio, List filters) { + super(item, aggregation, computeRatio, filters); + } + + /** + * Creates instance of simple measure definition to be used in {@link VisualizationObject} + * + * @see com.gooddata.executeafm.afm.SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier, Aggregation, Boolean, FilterItem...) + */ + public VOSimpleMeasureDefinition(ObjQualifier item, Aggregation aggregation, Boolean computeRatio, FilterItem... filters) { + super(item, aggregation, computeRatio, filters); + } } diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java b/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java index 9bb3ae718..4bebd96c4 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.executeafm.afm.AttributeItem; import java.util.Objects; @@ -22,6 +22,16 @@ public class VisualizationAttribute extends AttributeItem implements BucketItem private static final long serialVersionUID = -5144496152695494774L; static final String NAME = "visualizationAttribute"; + /** + * Creates new instance of visualization attribute for use in {@link Bucket} + * + * @param displayForm display form of attribute + * @param localIdentifier local identifier of attribute + */ + public VisualizationAttribute(final UriObjQualifier displayForm, final String localIdentifier) { + super(displayForm, localIdentifier); + } + /** * Creates new instance of visualization attribute for use in {@link Bucket} * @@ -30,7 +40,7 @@ public class VisualizationAttribute extends AttributeItem implements BucketItem * @param alias alias of attribute */ @JsonCreator - public VisualizationAttribute(@JsonProperty("displayForm") final ObjQualifier displayForm, + public VisualizationAttribute(@JsonProperty("displayForm") final UriObjQualifier displayForm, @JsonProperty("localIdentifier") final String localIdentifier, @JsonProperty("alias") final String alias) { super(displayForm, localIdentifier, alias); diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java index bd1eb5eff..6d5de4f70 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java @@ -15,7 +15,9 @@ import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT; import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; import static com.gooddata.md.visualization.CollectionType.*; +import static java.util.Collections.emptyList; import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.Validate.notEmpty; import static org.apache.commons.lang3.Validate.notNull; import com.gooddata.executeafm.UriObjQualifier; @@ -35,7 +37,11 @@ import java.util.function.Function; /** - * Stores complete information about new visualization object that can be stored as MD to md server + * Complete information about new visualization object that can be stored as MD object (see {@link com.gooddata.md.Obj}) + * to md server. + *

+ * The visualization object is part of new GD UI visualizations situated in AD and KPI dashboards. + * This object is a persistent form of AFM (Attribute, Measures, Filters) report executions. */ @JsonTypeName(VisualizationObject.NAME) @JsonTypeInfo(include = WRAPPER_OBJECT, use = NAME) @@ -43,7 +49,19 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class VisualizationObject extends AbstractObj implements Queryable, Updatable { static final String NAME = "visualizationObject"; - private Content content; + + @JsonProperty("content") + private final Content content; + + /** + * Constructor. + * + * @param title title of visualization object + * @param visualizationClassUri uri to the {@link VisualizationClass} + */ + public VisualizationObject(final String title, final String visualizationClassUri) { + this(new Content(notEmpty(visualizationClassUri), emptyList()), new Meta(notEmpty(title))); + } @JsonCreator private VisualizationObject(@JsonProperty("content") final Content content, @JsonProperty("meta") final Meta meta) { @@ -56,7 +74,7 @@ private VisualizationObject(@JsonProperty("content") final Content content, @Jso */ @JsonIgnore public List getMeasures() { - return getContent().getMeasures(); + return content.getMeasures(); } /** @@ -64,6 +82,7 @@ public List getMeasures() { * @param localIdentifier of measure * @return measure or null */ + @JsonIgnore public Measure getMeasure(final String localIdentifier) { return getMeasures().stream() .filter(measure -> measure.getLocalIdentifier().equals(localIdentifier)) @@ -86,9 +105,10 @@ public List getSimpleMeasures() { */ @JsonIgnore public List getAttributes() { - return getContent().getAttributes(); + return content.getAttributes(); } + @JsonIgnore public VisualizationAttribute getAttribute(final String localIdentifier) { return getAttributes().stream() .filter(attribute -> attribute.getLocalIdentifier().equals(localIdentifier)) @@ -104,7 +124,7 @@ public VisualizationAttribute getAttribute(final String localIdentifier) { */ @JsonIgnore public VisualizationAttribute getAttributeFromCollection(final CollectionType type) { - return getContent().getBuckets().stream() + return content.getBuckets().stream() .filter(bucket -> type.isValueOf(bucket.getLocalIdentifier())) .findFirst() .map(Bucket::getOnlyAttribute) @@ -172,11 +192,11 @@ public VisualizationAttribute getTrend() { } /** - * @return uri to visualization class + * @return uri to the {@link VisualizationClass} */ @JsonIgnore public String getVisualizationClassUri() { - return getContent().getVisualizationClassUri(); + return content.getVisualizationClassUri(); } /** @@ -184,7 +204,7 @@ public String getVisualizationClassUri() { */ @JsonIgnore public List getBuckets() { - return getContent().getBuckets(); + return content.getBuckets(); } /** @@ -200,7 +220,7 @@ public void setBuckets(List buckets) { */ @JsonIgnore public List getFilters() { - return getContent().getFilters(); + return content.getFilters(); } /** @@ -216,7 +236,7 @@ public void setFilters(List filters) { */ @JsonIgnore public String getProperties() { - return getContent().getProperties(); + return content.getProperties(); } /** @@ -232,7 +252,7 @@ public void setProperties(String properties) { */ @JsonIgnore public Map getReferenceItems() { - return getContent().getReferenceItems(); + return content.getReferenceItems(); } /** @@ -246,6 +266,7 @@ public void setReferenceItems(Map referenceItems) { /** * @return uri to visualizaton class wrapped as {@link UriObjQualifier} */ + @JsonIgnore public UriObjQualifier getVisualizationClass() { return content.getVisualizationClass(); } @@ -253,6 +274,7 @@ public UriObjQualifier getVisualizationClass() { /** * @param uri to replace previous visualization class's uri, wrapped as {@link UriObjQualifier} */ + @JsonIgnore public void setVisualizationClass(UriObjQualifier uri) { content.setVisualizationClass(uri); } @@ -281,10 +303,6 @@ public ResultSpec convertToResultSpec(Function visua return VisualizationConverter.convertToResultSpec(this, visualizationClassgetter); } - private Content getContent() { - return content; - } - @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content implements Serializable { @@ -296,6 +314,10 @@ private static class Content implements Serializable { private String properties; private Map referenceItems; + private Content(final String visualizationClassUri, final List buckets) { + this(new UriObjQualifier(visualizationClassUri), buckets, null, null, null); + } + @JsonCreator private Content(@JsonProperty("visualizationClass") final UriObjQualifier visualizationClass, @JsonProperty("buckets") final List buckets, @@ -373,6 +395,7 @@ public UriObjQualifier getVisualizationClass() { return visualizationClass; } + @JsonProperty("references") public Map getReferenceItems() { return referenceItems; } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy index 7949e9030..29c6bcb5c 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy @@ -25,7 +25,7 @@ class SimpleMeasureDefinitionTest extends Specification { def "should serialize full"() { expect: that new SimpleMeasureDefinition(QUALIFIER, Aggregation.AVG, - true, new PositiveAttributeFilter(QUALIFIER,'foo')), + true, new PositiveAttributeFilter(QUALIFIER,'foo'), new NegativeAttributeFilter(QUALIFIER, 'foo')), jsonEquals(resource(SIMPLE_MEASURE_DEFINITION_FULL_JSON)) } @@ -50,15 +50,19 @@ class SimpleMeasureDefinitionTest extends Specification { SimpleMeasureDefinition definition = readObjectFromResource("/$SIMPLE_MEASURE_DEFINITION_FULL_JSON", SimpleMeasureDefinition) then: - with(definition.item as UriObjQualifier) { + with(definition?.item as UriObjQualifier) { uri == QUALIFIER.uri } - definition.aggregation == 'avg' - definition.computeRatio - with(definition.filters[0] as PositiveAttributeFilter) { - (it.displayForm as UriObjQualifier).uri == QUALIFIER.uri + definition?.aggregation == 'avg' + definition?.computeRatio + with(definition?.filters?.find { it.class == PositiveAttributeFilter }) { + it.displayForm?.uri == QUALIFIER.uri it.in == ['foo'] } + with(definition?.filters?.find { it.class == NegativeAttributeFilter }) { + it.displayForm?.uri == QUALIFIER.uri + it.notIn == ['foo'] + } } def "should have default properties"() { diff --git a/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy b/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy index 7d2b69797..96426d164 100644 --- a/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/MeasureTest.groovy @@ -5,6 +5,7 @@ */ package com.gooddata.md.visualization +import com.gooddata.executeafm.UriObjQualifier import nl.jqno.equalsverifier.EqualsVerifier import org.apache.commons.lang3.SerializationUtils import spock.lang.Shared @@ -12,11 +13,13 @@ import spock.lang.Specification import static com.gooddata.util.ResourceUtils.readObjectFromResource import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource import static spock.util.matcher.HamcrestSupport.that class MeasureTest extends Specification { private static final String MULTIPLE_MEASURES_BUCKET = "md/visualization/multipleMeasuresBucket.json" private static final String MEASURE_BUCKET = "md/visualization/measureBucket.json" + public static final String SIMPLE_MEASURE_JSON = 'md/visualization/simpleMeasure.json' @Shared Bucket bucket = readObjectFromResource("/$MULTIPLE_MEASURES_BUCKET", Bucket) @@ -63,6 +66,11 @@ class MeasureTest extends Specification { that deserialized, jsonEquals(measureWithCr) } + def "test serialize simple"() { + expect: + that new Measure(new VOSimpleMeasureDefinition(new UriObjQualifier('uri')), 'loc1'), jsonEquals(resource(SIMPLE_MEASURE_JSON)) + } + def "should verify equals"() { expect: EqualsVerifier.forClass(Measure).usingGetClass() diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationAttributeTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationAttributeTest.groovy new file mode 100644 index 000000000..125ccaaba --- /dev/null +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationAttributeTest.groovy @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.md.visualization + +import com.gooddata.executeafm.UriObjQualifier +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + + +class VisualizationAttributeTest extends Specification { + + static final String JSON = 'md/visualization/visualizationAttribute.json' + static final String JSON_FULL = 'md/visualization/visualizationAttributeFull.json' + + def "should serialize"() { + expect: + that new VisualizationAttribute(new UriObjQualifier('/some/uri'), 'li1'), jsonEquals(resource(JSON)) + } + + def "should serialize full"() { + expect: + that new VisualizationAttribute(new UriObjQualifier('/some/uri'), 'li1', 'Some alias'), jsonEquals(resource(JSON_FULL)) + } + + def "should deserialize"() { + when: + def vizAttribute = readObjectFromResource("/$JSON_FULL".toString(), VisualizationAttribute) + + then: + vizAttribute?.displayForm?.uri == '/some/uri' + vizAttribute?.localIdentifier == 'li1' + vizAttribute?.alias == 'Some alias' + } +} diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy index a81180edc..09ae144d3 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationObjectTest.groovy @@ -10,7 +10,6 @@ import com.gooddata.executeafm.afm.AbsoluteDateFilter import com.gooddata.executeafm.afm.NegativeAttributeFilter import com.gooddata.executeafm.afm.PositiveAttributeFilter import com.gooddata.executeafm.afm.RelativeDateFilter -import com.gooddata.md.Meta import org.apache.commons.lang3.SerializationUtils import org.joda.time.LocalDate import spock.lang.Shared @@ -19,6 +18,7 @@ import spock.lang.Unroll import static com.gooddata.util.ResourceUtils.readObjectFromResource import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource import static spock.util.matcher.HamcrestSupport.that class VisualizationObjectTest extends Specification { @@ -41,70 +41,77 @@ class VisualizationObjectTest extends Specification { @Shared VisualizationObject multipleMeasuresVisualization = readObjectFromResource("/$MULTIPLE_MEASURE_BUCKETS", VisualizationObject) + def "should deserialize full"() { + expect: + complexVisualization?.title == 'complex' + complexVisualization?.visualizationClassUri == 'visClass' + complexVisualization?.buckets?.size() == 2 + complexVisualization?.buckets?.find { it.localIdentifier == 'bucket1' }?.items?.every { it.class == VisualizationAttribute } + complexVisualization?.buckets?.find { it.localIdentifier == 'bucket2' }?.items?.every { it.class == Measure } + complexVisualization?.filters?.size() == 4 + complexVisualization?.filters?.find { it.class == PositiveAttributeFilter } + complexVisualization?.filters?.find { it.class == NegativeAttributeFilter } + complexVisualization?.filters?.find { it.class == AbsoluteDateFilter } + complexVisualization?.filters?.find { it.class == RelativeDateFilter } + complexVisualization?.properties == '{"key":"value"}' + complexVisualization?.referenceItems?.size() == 2 + } + def "should serialize full"() { - VisualizationAttribute attribute1 = new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm/1"), "attribute1", "attributeAlias") - PositiveAttributeFilter positiveAttributeFilter = new PositiveAttributeFilter( new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]) - NegativeAttributeFilter negativeAttributeFilter = new NegativeAttributeFilter( new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]) - AbsoluteDateFilter absoluteDateFilter = new AbsoluteDateFilter( new UriObjQualifier("/uri/to/dataSet/1"), new LocalDate("2000-08-30"), new LocalDate("2017-08-07")) - RelativeDateFilter relativeDateFilter = new RelativeDateFilter( new UriObjQualifier("/uri/to/dataSet/2"), "month", 0, -11) - VOSimpleMeasureDefinition measureDefinition = new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/1"), "sum", false, [positiveAttributeFilter, negativeAttributeFilter, absoluteDateFilter, relativeDateFilter ]) + given: + VOSimpleMeasureDefinition measureDefinition = new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/1"), 'sum', false, + [new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3")), + new NegativeAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), + new AbsoluteDateFilter(new UriObjQualifier("/uri/to/dataSet/1"), null, null), + new RelativeDateFilter(new UriObjQualifier("/uri/to/dataSet/2"), "month", 0, -11)]) + Map references = new HashMap<>() references.put("key", "value") references.put("foo", "bar") + VisualizationObject vizObject = new VisualizationObject('complex', 'visClass') + vizObject.buckets = [ + new Bucket('bucket1', [new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm/1"), "attribute1", "attributeAlias")]), + new Bucket('bucket2', [ + new Measure( + new VOSimpleMeasureDefinition(new UriObjQualifier('/uri/to/measure/0')), + 'measure0', + 'Measure 0 alias', + null, + null + ), + new Measure( + measureDefinition, + 'measure1', + 'Measure 1 alias', + 'Measure 1', + null + ) + ]) + ] + vizObject.filters = [ + new PositiveAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), ["ab", "cd"]), + new NegativeAttributeFilter(new UriObjQualifier("/uri/to/displayForm/3"), []), + new AbsoluteDateFilter(new UriObjQualifier("/uri/to/dataSet/1"), new LocalDate("2000-08-30"), new LocalDate("2017-08-07")), + new RelativeDateFilter(new UriObjQualifier("/uri/to/dataSet/2"), "month", null, null) + ] + vizObject.properties = '{"key":"value"}' + vizObject.referenceItems = references + expect: - that new VisualizationObject( - new VisualizationObject.Content( - new UriObjQualifier("visClass"), - [ - new Bucket("bucket1", [attribute1]), - new Bucket("bucket2", [ - new Measure( - new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure/0"), null, null, null), - "measure0", - "Measure 0 alias", - null, - null - ), - new Measure( - measureDefinition, - "measure1", - "Measure 1 alias", - "Measure 1", - null - ) - ]) - ], - [ - positiveAttributeFilter, - negativeAttributeFilter, - absoluteDateFilter, - relativeDateFilter - ], - "{\"key\":\"value\"}", - references - ), - new Meta("complex") - ), jsonEquals(complexVisualization) + that vizObject, jsonEquals(resource(COMPLEX_VISUALIZATION)) } - def "should serialize"() { + def "should serialize simple"() { + given: VisualizationObject simpleVisualization = readObjectFromResource("/$SIMPLE_VISUALIZATION", VisualizationObject) expect: - that new VisualizationObject( - new VisualizationObject.Content( - new UriObjQualifier("visClass"), - [], - null, - null, - null - ), - new Meta("simple") - ), jsonEquals(simpleVisualization) + that new VisualizationObject('simple', 'visClass'), jsonEquals(simpleVisualization) } def "should return null when invalid collection requested"() { + given: VisualizationObject customChart = readObjectFromResource("/$CUSTOM_CHART", VisualizationObject) when: @@ -117,18 +124,16 @@ class VisualizationObjectTest extends Specification { } @Unroll - def "return item in #name collection"() { - VisualizationAttribute attribute = getter() - + "return item in #name collection"() { expect: - attribute == expected + getter() == expected where: name | getter | expected - "view" | stackedColumnChart.&getView | stackedColumnChart.getBuckets().get(0).getItems().get(0) - "stack" | stackedColumnChart.&getStack | stackedColumnChart.getBuckets().get(1).getItems().get(0) - "trend" | segmentedLineChart.&getTrend | segmentedLineChart.getBuckets().get(0).getItems().get(0) - "segment" | segmentedLineChart.&getSegment | segmentedLineChart.getBuckets().get(1).getItems().get(0) + "view" | stackedColumnChart.&getView | stackedColumnChart.buckets[0].items[0] + "stack" | stackedColumnChart.&getStack | stackedColumnChart.buckets[1].items[0] + "trend" | segmentedLineChart.&getTrend | segmentedLineChart.buckets[0].items[0] + "segment" | segmentedLineChart.&getSegment | segmentedLineChart.buckets[1].items[0] } def "should return null when non-existing key requested"() { @@ -145,9 +150,9 @@ class VisualizationObjectTest extends Specification { where: measures | expected - multipleMeasuresVisualization.getMeasures() | [ multipleMeasuresVisualization.content.buckets.get(0).getItems().get(0), - multipleMeasuresVisualization.content.buckets.get(1).getItems().get(0), - multipleMeasuresVisualization.content.buckets.get(1).getItems().get(1) ] + multipleMeasuresVisualization.getMeasures() | [ multipleMeasuresVisualization.buckets[0].items[0], + multipleMeasuresVisualization.buckets[1].items[0], + multipleMeasuresVisualization.buckets[1].items[1] ] emptyBucketsVisualization.getMeasures() | [] } @@ -157,8 +162,8 @@ class VisualizationObjectTest extends Specification { where: measures | expected - multipleMeasuresVisualization.getSimpleMeasures() | [ multipleMeasuresVisualization.content.buckets.get(0).getItems().get(0), - multipleMeasuresVisualization.content.buckets.get(1).getItems().get(0) ] + multipleMeasuresVisualization.getSimpleMeasures() | [ multipleMeasuresVisualization.buckets[0].items[0], + multipleMeasuresVisualization.buckets[1].items[0] ] emptyBucketsVisualization.getSimpleMeasures() | [] } @@ -168,12 +173,13 @@ class VisualizationObjectTest extends Specification { where: attributes | expected - segmentedLineChart.getAttributes() | [ segmentedLineChart.content.buckets.get(0).getItems().get(0), - segmentedLineChart.content.buckets.get(1).getItems().get(0) ] + segmentedLineChart.getAttributes() | [ segmentedLineChart.buckets[0].items[0], + segmentedLineChart.buckets[1].items[0] ] emptyBucketsVisualization.getAttributes() | [] } def "should check if visualization object has derived measures"() { + given: VisualizationObject visualizationWithPop = multipleMeasuresVisualization VisualizationObject visualizationWithoutPop = segmentedLineChart VisualizationObject noMeasuresVisualization = emptyBucketsVisualization @@ -187,7 +193,8 @@ class VisualizationObjectTest extends Specification { } @Unroll - def "should set #property"() { + "should set #property"() { + given: VisualizationObject empty = readObjectFromResource("/$EMPTY_BUCKETS", VisualizationObject) when: @@ -201,9 +208,10 @@ class VisualizationObjectTest extends Specification { } def "test serializable"() { + when: VisualizationObject deserialized = SerializationUtils.roundtrip(complexVisualization) - expect: + then: that deserialized, jsonEquals(complexVisualization) } } \ No newline at end of file diff --git a/src/test/resources/executeafm/afm/simpleMeasureDefinitionFull.json b/src/test/resources/executeafm/afm/simpleMeasureDefinitionFull.json index 275808662..ba00e3100 100644 --- a/src/test/resources/executeafm/afm/simpleMeasureDefinitionFull.json +++ b/src/test/resources/executeafm/afm/simpleMeasureDefinitionFull.json @@ -15,6 +15,16 @@ "foo" ] } + }, + { + "negativeAttributeFilter": { + "displayForm": { + "uri": "/gdc/md/projectId/obj/1" + }, + "notIn": [ + "foo" + ] + } } ] } diff --git a/src/test/resources/md/visualization/simpleMeasure.json b/src/test/resources/md/visualization/simpleMeasure.json new file mode 100644 index 000000000..7dbe39744 --- /dev/null +++ b/src/test/resources/md/visualization/simpleMeasure.json @@ -0,0 +1,12 @@ +{ + "measure": { + "localIdentifier": "loc1", + "definition": { + "measureDefinition": { + "item": { + "uri": "uri" + } + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/visualization/visualizationAttribute.json b/src/test/resources/md/visualization/visualizationAttribute.json new file mode 100644 index 000000000..4e1b8eb90 --- /dev/null +++ b/src/test/resources/md/visualization/visualizationAttribute.json @@ -0,0 +1,8 @@ +{ + "visualizationAttribute": { + "displayForm": { + "uri": "/some/uri" + }, + "localIdentifier": "li1" + } +} diff --git a/src/test/resources/md/visualization/visualizationAttributeFull.json b/src/test/resources/md/visualization/visualizationAttributeFull.json new file mode 100644 index 000000000..368bf1326 --- /dev/null +++ b/src/test/resources/md/visualization/visualizationAttributeFull.json @@ -0,0 +1,9 @@ +{ + "visualizationAttribute": { + "displayForm": { + "uri": "/some/uri" + }, + "localIdentifier": "li1", + "alias": "Some alias" + } +} From db1fec0fa05e2383e4a250278487781ff79e91c3 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 16 Apr 2018 13:38:40 +0200 Subject: [PATCH 066/548] add acceptance test for ExecuteAfm#executeVisualization --- .../executeafm/ExecuteAfmServiceAT.java | 69 ++++++++++++++++--- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java b/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java index 0f9b72a4b..6eb334553 100644 --- a/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java +++ b/src/test/java/com/gooddata/executeafm/ExecuteAfmServiceAT.java @@ -18,11 +18,18 @@ import com.gooddata.executeafm.result.DataValue; import com.gooddata.executeafm.result.ExecutionResult; import com.gooddata.executeafm.result.ResultHeaderItem; +import com.gooddata.md.visualization.Bucket; +import com.gooddata.md.visualization.Measure; +import com.gooddata.md.visualization.VOSimpleMeasureDefinition; +import com.gooddata.md.visualization.VisualizationAttribute; +import com.gooddata.md.visualization.VisualizationClass; +import com.gooddata.md.visualization.VisualizationObject; import org.testng.annotations.Test; import java.util.Collection; import java.util.List; +import static com.gooddata.md.Restriction.identifier; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static java.util.stream.Collectors.toList; @@ -35,17 +42,64 @@ public class ExecuteAfmServiceAT extends AbstractGoodDataAT { - private ExecutionResponse response; + private static final String GDC_TABLE_VISUALIZATION_CLASS_ID = "gdc.visualization.table"; + private static final String ATTRIBUTE_LOCAL_IDENTIFIER = "a1"; + private static final String MEASURE_LOCAL_IDENTIFIER = "m1"; - @Test(dependsOnGroups = {"model", "md", "dataset"}) + private ExecutionResponse afmResponse; + private ExecutionResponse visResponse; + + @Test(groups = "executeAfm", dependsOnGroups = {"model", "md", "dataset"}) public void testExecuteAfm() { final Execution execution = new Execution(new Afm() - .addAttribute(new AttributeItem(new IdentifierObjQualifier(attr.getDefaultDisplayForm().getIdentifier()), "a1")) - .addMeasure(new MeasureItem(new SimpleMeasureDefinition(new UriObjQualifier(metric.getUri())), "m1")) + .addAttribute(new AttributeItem(new IdentifierObjQualifier(attr.getDefaultDisplayForm().getIdentifier()), + ATTRIBUTE_LOCAL_IDENTIFIER)) + .addMeasure(new MeasureItem(new SimpleMeasureDefinition(new UriObjQualifier(metric.getUri())), + MEASURE_LOCAL_IDENTIFIER)) ); - response = gd.getExecuteAfmService().executeAfm(project, execution); + afmResponse = gd.getExecuteAfmService().executeAfm(project, execution); + + checkExecutionResponse(afmResponse); + } + + @Test(groups = "executeAfm", dependsOnGroups = {"model", "md", "dataset"}) + public void testExecuteVisualization() { + final VisualizationObject vizObject = createVisualizationObject(); + final VisualizationExecution execution = new VisualizationExecution(vizObject.getUri()); + + visResponse = gd.getExecuteAfmService().executeVisualization(project, execution); + + checkExecutionResponse(visResponse); + } + + @Test(groups = "executeAfm", dependsOnMethods = "testExecuteAfm") + public void testGetAfmExecutionResult() { + final ExecutionResult afmResult = gd.getExecuteAfmService().getResult(afmResponse).get(); + checkExecutionResult(afmResult); + } + + @Test(groups = "executeAfm", dependsOnMethods = "testExecuteVisualization") + public void testGetVisualizationExecutionResult() { + final ExecutionResult visResult = gd.getExecuteAfmService().getResult(visResponse).get(); + checkExecutionResult(visResult); + } + private VisualizationObject createVisualizationObject() { + final String vizClassUri = gd.getMetadataService().getObjUri(project, VisualizationClass.class, + identifier(GDC_TABLE_VISUALIZATION_CLASS_ID)); + + final VisualizationObject vizObject = new VisualizationObject("some title", vizClassUri); + vizObject.setBuckets(asList( + new Bucket("vizObjBucket1", singletonList(new VisualizationAttribute( + new UriObjQualifier(attr.getDefaultDisplayForm().getUri()), ATTRIBUTE_LOCAL_IDENTIFIER))), + new Bucket("vizObjBucket2", singletonList(new Measure( + new VOSimpleMeasureDefinition(new UriObjQualifier(metric.getUri())), MEASURE_LOCAL_IDENTIFIER))) + )); + return gd.getMetadataService().createObj(project, vizObject); + } + + private static void checkExecutionResponse(final ExecutionResponse response) { assertThat(response, notNullValue()); assertThat("should have 2 dimensions", response.getDimensions(), hasSize(2)); @@ -63,10 +117,7 @@ public void testExecuteAfm() { assertThat("the only measureHeader should point to given metric", measureGroupHeader.getItems().get(0).getUri(), is(metric.getUri())); } - @Test(dependsOnMethods = "testExecuteAfm") - public void testGetResult() { - final ExecutionResult result = gd.getExecuteAfmService().getResult(response).get(); - + private static void checkExecutionResult(final ExecutionResult result) { assertThat(result, notNullValue()); final List firstDimHeaders = result.getHeaderItems().get(0).get(0); From 90b8924e38a62073b8184224bed11e06058a145b Mon Sep 17 00:00:00 2001 From: Richard Benkovsky Date: Tue, 17 Apr 2018 13:44:49 +0200 Subject: [PATCH 067/548] Make `release.sh` Mac compatible On Mac, we need to provide extension for backup-file - but when empty string is provided, it behaves exactly the same as `-i` (without argument) on Linux --- release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.sh b/release.sh index 3af0d471f..d15a687a1 100755 --- a/release.sh +++ b/release.sh @@ -61,6 +61,6 @@ then fi mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" -sed -i "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md +sed -i '' "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md git commit -a -m "bump version" git push origin --tags HEAD From c41eea062d9002413e9922b8b41004eeb2790c25 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 17 Apr 2018 13:52:15 +0200 Subject: [PATCH 068/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0fb845c2..bb550b65d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.24.0 + 2.25.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 89ea343fff30b57532d30d1ef4703905f00c97dd Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 11 May 2018 19:28:41 +0200 Subject: [PATCH 069/548] raise jackson version This should get rid of unauthenticated remote code execution vulnerability --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 938c05e3e..6a56f6e34 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,8 @@ 4.3.3 - 2.8.4 + 2.8.11 + 2.8.11.1 4.3.1.RELEASE 1.1.1 1.23.0 @@ -317,7 +318,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.databind.version} com.fasterxml.jackson.core From db1ce7f9afd7e00cb5027c7203326b402275d6a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 14 May 2018 13:30:14 +0200 Subject: [PATCH 070/548] bump version --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6a56f6e34..e4b9db719 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.25.1-SNAPSHOT + 2.25.1 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.25.1 From c6bbe023e70ab78e9b65e24742523c0e34f59bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 14 May 2018 13:32:33 +0200 Subject: [PATCH 071/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e4b9db719..2da31fb8f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.25.1 + 2.25.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.25.1 + HEAD From 848a1ca0fd9f66db728bf5e178207445cc352765 Mon Sep 17 00:00:00 2001 From: xMort Date: Wed, 2 May 2018 08:10:09 +0200 Subject: [PATCH 072/548] Revert offset attribute from the PoP measure definition --- .../executeafm/afm/PopMeasureDefinition.java | 34 +---------------- .../visualization/VOPopMeasureDefinition.java | 20 +--------- .../afm/PopMeasureDefinitionTest.groovy | 38 ++++--------------- .../afm/popMeasureDefinitionWithOffset.json | 9 ----- 4 files changed, 11 insertions(+), 90 deletions(-) delete mode 100644 src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java index 91c2daa5f..5da1e7dd4 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java @@ -31,8 +31,6 @@ public class PopMeasureDefinition implements MeasureDefinition, Serializable { private final ObjQualifier popAttribute; - private final Integer offset; - /** * Creates new definition from given measure identifier referencing another measure in {@link Afm} and given attribute qualifier (should qualify date * attribute) @@ -41,36 +39,17 @@ public class PopMeasureDefinition implements MeasureDefinition, Serializable { * measure identifier * @param popAttribute * "period over period" date attribute - * @param offset - * the number of periods the time window defined by {@code popAttribute} is offset about to the past (when value is negative) or future (when - * value is positive) */ @JsonCreator public PopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier, - @JsonProperty("popAttribute") final ObjQualifier popAttribute, - @JsonProperty("offset") final Integer offset) { + @JsonProperty("popAttribute") final ObjQualifier popAttribute) { this.measureIdentifier = measureIdentifier; this.popAttribute = popAttribute; - this.offset = offset; - } - - /** - * Creates new definition from given measure identifier referencing another measure in {@link Afm} and given attribute qualifier (should qualify date - * attribute) - * - * @param measureIdentifier - * measure identifier - * @param popAttribute - * "period over period" date attribute - */ - public PopMeasureDefinition(final String measureIdentifier, - final ObjQualifier popAttribute) { - this(measureIdentifier, popAttribute, null); } @Override public MeasureDefinition withObjUriQualifier(final UriObjQualifier qualifier) { - return new PopMeasureDefinition(measureIdentifier, qualifier, offset); + return new PopMeasureDefinition(measureIdentifier, qualifier); } /** @@ -89,15 +68,6 @@ public ObjQualifier getPopAttribute() { return popAttribute; } - /** - * Returns number of periods defined via {@link #popAttribute} time interval. - * - * @return positive or negative number of periods or {@code null} when offset was not defined - */ - public Integer getOffset() { - return offset; - } - @Override public ObjQualifier getObjQualifier() { return getPopAttribute(); diff --git a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java b/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java index f031bcd16..08b6647e1 100644 --- a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java +++ b/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java @@ -33,27 +33,11 @@ public class VOPopMeasureDefinition extends com.gooddata.executeafm.afm.PopMeasu * reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated * @param popAttribute * uri to attribute used for PoP - * @param offset - * the number of periods defined via the {@code popAttribute} time interval to the past (when value is negative) or to the future (when - * value is positive) */ @JsonCreator public VOPopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier, - @JsonProperty("popAttribute") final ObjQualifier popAttribute, - @JsonProperty("offset") final Integer offset) { - super(measureIdentifier, popAttribute, offset); - } - - /** - * Creates instance of Period over Period measure definition to be used in {@link VisualizationObject} - * - * @param measureIdentifier - * reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated - * @param popAttribute - * uri to attribute used for PoP - */ - public VOPopMeasureDefinition(final String measureIdentifier, - final ObjQualifier popAttribute) { + @JsonProperty("popAttribute") final ObjQualifier popAttribute) { super(measureIdentifier, popAttribute); } + } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy index c1c8ef847..6372e6262 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy @@ -17,64 +17,40 @@ import static spock.util.matcher.HamcrestSupport.that class PopMeasureDefinitionTest extends Specification { - private static final String POP_MEASURE_JSON = 'executeafm/afm/popMeasureDefinition.json' - private static final String POP_MEASURE_WITH_OFFSET_JSON = 'executeafm/afm/popMeasureDefinitionWithOffset.json' - + private static final String POP_MEASURE_DEFINITION_JSON = 'executeafm/afm/popMeasureDefinition.json' def "should serialize"() { expect: - that new PopMeasureDefinition('mId', new UriObjQualifier('/gdc/md/projectId/obj/1'), offset), - jsonEquals(resource(expectedJsonMeasureDefinition)) - - where: - offset | expectedJsonMeasureDefinition - null | POP_MEASURE_JSON - -2 | POP_MEASURE_WITH_OFFSET_JSON + that new PopMeasureDefinition('mId', new UriObjQualifier('/gdc/md/projectId/obj/1')), + jsonEquals(resource(POP_MEASURE_DEFINITION_JSON)) } def "should deserialize"() { when: - PopMeasureDefinition measure = readObjectFromResource("/$jsonMeasureDefinition", PopMeasureDefinition) + PopMeasureDefinition measure = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition) then: measure.measureIdentifier == 'mId' (measure.popAttribute as UriObjQualifier).uri == '/gdc/md/projectId/obj/1' measure.isAdHoc() measure.toString() - measure.offset == expectedOffset - - where: - jsonMeasureDefinition | expectedOffset - POP_MEASURE_JSON | null - POP_MEASURE_WITH_OFFSET_JSON | -2 } def "should copy"() { when: - def measure = new PopMeasureDefinition("mId", new IdentifierObjQualifier("id"), inputOffset) + def measure = new PopMeasureDefinition("mid", new IdentifierObjQualifier("id")) def copy = measure.withObjUriQualifier(new UriObjQualifier("uri")) then: - copy.measureIdentifier == 'mId' copy.objQualifier.uri == 'uri' - copy.offset == expectedOffset - - where: - inputOffset | expectedOffset - null | null - -2 | -2 } def "test serializable"() { - when: - PopMeasureDefinition measureDefinition = readObjectFromResource("/$jsonMeasureDefinition", PopMeasureDefinition) + PopMeasureDefinition measureDefinition = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition) PopMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) - then: + expect: that deserialized, jsonEquals(measureDefinition) - - where: - jsonMeasureDefinition << [POP_MEASURE_JSON, POP_MEASURE_WITH_OFFSET_JSON] } } diff --git a/src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json b/src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json deleted file mode 100644 index adb5f1ae7..000000000 --- a/src/test/resources/executeafm/afm/popMeasureDefinitionWithOffset.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "popMeasure": { - "measureIdentifier": "mId", - "popAttribute": { - "uri": "/gdc/md/projectId/obj/1" - }, - "offset": -2 - } -} From 71408f2c07a162a917dc56e4868abab05c174cc6 Mon Sep 17 00:00:00 2001 From: xMort Date: Wed, 2 May 2018 17:47:47 +0200 Subject: [PATCH 073/548] Introduce support for Over period and Previous period measure definition --- .../executeafm/afm/MeasureDefinition.java | 55 +++++- .../afm/ObjIdentifierUtilities.java | 73 ++++++++ .../executeafm/afm/ObjQualifierConverter.java | 26 +++ .../afm/OverPeriodDateAttribute.java | 86 +++++++++ .../afm/OverPeriodMeasureDefinition.java | 166 ++++++++++++++++++ .../executeafm/afm/PopMeasureDefinition.java | 71 +++++++- .../afm/PreviousPeriodDateDataSet.java | 85 +++++++++ .../afm/PreviousPeriodMeasureDefinition.java | 166 ++++++++++++++++++ .../afm/SimpleMeasureDefinition.java | 125 ++++++++++--- .../afm/MeasureDefinitionTest.groovy | 8 +- .../afm/ObjIdentifierUtilitiesTest.groovy | 103 +++++++++++ .../afm/OverPeriodDateAttributeTest.groovy | 66 +++++++ .../OverPeriodMeasureDefinitionTest.groovy | 152 ++++++++++++++++ .../afm/PopMeasureDefinitionTest.groovy | 65 ++++++- .../afm/PreviousPeriodDateDataSetTest.groovy | 66 +++++++ ...PreviousPeriodMeasureDefinitionTest.groovy | 154 ++++++++++++++++ .../afm/SimpleMeasureDefinitionTest.groovy | 68 ++++++- .../afm/overPeriodDateAttribute.json | 6 + .../afm/overPeriodMeasureDefinition.json | 13 ++ ...iodMeasureDefinitionWithTwoAttributes.json | 19 ++ .../afm/previousPeriodDateDataSet.json | 6 + .../afm/previousPeriodMeasureDefinition.json | 13 ++ ...eriodMeasureDefinitionWithTwoDataSets.json | 19 ++ 23 files changed, 1576 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java create mode 100644 src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java create mode 100644 src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java create mode 100644 src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java create mode 100644 src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java create mode 100644 src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java create mode 100644 src/test/groovy/com/gooddata/executeafm/afm/ObjIdentifierUtilitiesTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/afm/OverPeriodDateAttributeTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/afm/OverPeriodMeasureDefinitionTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodDateDataSetTest.groovy create mode 100644 src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinitionTest.groovy create mode 100644 src/test/resources/executeafm/afm/overPeriodDateAttribute.json create mode 100644 src/test/resources/executeafm/afm/overPeriodMeasureDefinition.json create mode 100644 src/test/resources/executeafm/afm/overPeriodMeasureDefinitionWithTwoAttributes.json create mode 100644 src/test/resources/executeafm/afm/previousPeriodDateDataSet.json create mode 100644 src/test/resources/executeafm/afm/previousPeriodMeasureDefinition.json create mode 100644 src/test/resources/executeafm/afm/previousPeriodMeasureDefinitionWithTwoDataSets.json diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java index 3d9b93e08..4f2ca5a4b 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java @@ -8,23 +8,29 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.gooddata.executeafm.IdentifierObjQualifier; import com.gooddata.executeafm.ObjQualifier; import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.md.visualization.VOPopMeasureDefinition; import com.gooddata.md.visualization.VOSimpleMeasureDefinition; +import java.util.Collection; + @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonSubTypes({ @JsonSubTypes.Type(value = SimpleMeasureDefinition.class, name = SimpleMeasureDefinition.NAME), @JsonSubTypes.Type(value = PopMeasureDefinition.class, name = PopMeasureDefinition.NAME), @JsonSubTypes.Type(value = VOSimpleMeasureDefinition.class, name = VOSimpleMeasureDefinition.NAME), @JsonSubTypes.Type(value = VOPopMeasureDefinition.class, name = VOPopMeasureDefinition.NAME), + @JsonSubTypes.Type(value = OverPeriodMeasureDefinition.class, name = OverPeriodMeasureDefinition.NAME), + @JsonSubTypes.Type(value = PreviousPeriodMeasureDefinition.class, name = PreviousPeriodMeasureDefinition.NAME), }) public interface MeasureDefinition { /** * Returns the definition in the form of uri of {@link com.gooddata.md.Metric}. * Default implementation throws {@link UnsupportedOperationException} + * * @return uri of the measure */ @JsonIgnore @@ -34,18 +40,63 @@ default String getUri() { /** * Returns the qualifier, qualifying the {@link com.gooddata.md.Metric}. + * * @return qualifier of measure + * + * @throws UnsupportedOperationException + * The exception is thrown when the method is not supported by the implementation. + * @deprecated Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead as this method is not supported by all the existing implementations. */ @JsonIgnore + @Deprecated ObjQualifier getObjQualifier(); /** - * Copy itself using given uri qualifier - * @param qualifier qualifier to use for the new filter + * Returns all the qualifiers used by the measure definition and its encapsulated objects. + *

+ * This information comes handy if it is necessary, for example, to convert the measure definition to use just the URI object qualifiers instead of the + * identifier object qualifiers. It can be used to gather these for a conversion service. + * + * @return all the qualifiers the measure definition uses, even in its encapsulated objects (apart from the measure filters) + */ + @JsonIgnore + Collection getObjQualifiers(); + + /** + * Copy itself using given URI qualifier. + * + * @param qualifier + * The qualifier to use by the new object. + * * @return self copy with given qualifier + * + * @throws UnsupportedOperationException + * The exception is thrown when the method is not supported by the implementation. + * @deprecated Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead as this method is not supported by all the existing implementations. */ + @Deprecated MeasureDefinition withObjUriQualifier(UriObjQualifier qualifier); + /** + * Copy itself using the given object qualifier converter in case when {@link IdentifierObjQualifier} instances are used in the object otherwise the + * original object is returned. + *

+ * The provided converter must be able to handle the conversion for the qualifiers that are of the {@link IdentifierObjQualifier} type that are used by + * this object or its encapsulated child objects. + * + * @param objQualifierConverter + * The function that converts identifier qualifiers to the matching URI qualifiers. In case when the object uses the identifier qualifiers, it + * will return a new copy of itself or its encapsulated objects that used URI qualifiers, otherwise the original object is returned. + * The parameter must not be null. + * + * @return copy of itself with replaced qualifiers in case when some {@link IdentifierObjQualifier} were used, otherwise original object is returned. + * + * @throws IllegalArgumentException + * The exception is thrown when conversion for the identifier qualifier used by this measure definition could not be made by the provided + * converter or when provided converter is null. + */ + MeasureDefinition withObjUriQualifiers(ObjQualifierConverter objQualifierConverter); + /** * @return true if this definition represents ad hoc specified measure, false otherwise */ diff --git a/src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java b/src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java new file mode 100644 index 000000000..7cb682998 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.executeafm.afm; + +import com.gooddata.executeafm.IdentifierObjQualifier; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.UriObjQualifier; + +import java.util.function.Function; + +import static com.gooddata.util.Validate.notNull; +import static java.lang.String.format; + +/** + * The utilities for conversion of the objects that use {@link IdentifierObjQualifier} to objects that use {@link UriObjQualifier}. + */ +abstract class ObjIdentifierUtilities { + + /** + * Copy {@code objectToBeCopied} via provided {@code objectCopyFactory} in case when {@code qualifierForPossibleConversion} is of {@link + * IdentifierObjQualifier} type. Otherwise the original object is returned. + * + * @param objectToBeCopied + * The object that should be copied in case {@code qualifierForPossibleConversion} is of {@link IdentifierObjQualifier} type. The parameter must + * not be null. + * @param qualifierForPossibleConversion + * The qualifier that defines if {@code objectToBeCopied} will be copied or not. In case when it is of the {@link IdentifierObjQualifier} type, + * it will be converted via {@code qualifierConverter} and used in copy of the {@code objectToBeCopied}. The parameter must not be null. + * @param objectCopyFactory + * The factory method that accepts the result of the {@code qualifierForPossibleConversion} conversion in form of {@link UriObjQualifier} and + * returns new copy of the {@code objectToBeCopied}. The parameter must not be null. + * @param qualifierConverter + * The convert that can convert {@code qualifierForPossibleConversion} into its matching {@link UriObjQualifier} form. The parameter must not be + * null. + * @param + * The type of the object that should be copied. + * + * @return Copy of the {@code objectToBeCopied} in case when {@code qualifierForPossibleConversion} was of {@link IdentifierObjQualifier} type. Otherwise + * the original object is returned. + * + * @throws IllegalArgumentException + * The exception is thrown when required parameter is null. + */ + static R copyIfNecessary(final R objectToBeCopied, + final ObjQualifier qualifierForPossibleConversion, + final Function objectCopyFactory, + final ObjQualifierConverter qualifierConverter) { + notNull(objectToBeCopied, "objectToBeCopied"); + notNull(qualifierForPossibleConversion, "qualifierForPossibleConversion"); + notNull(objectCopyFactory, "objectCopyFactory"); + notNull(qualifierConverter, "qualifierConverter"); + + if (qualifierForPossibleConversion instanceof IdentifierObjQualifier) { + final IdentifierObjQualifier identifierQualifierToConvert = (IdentifierObjQualifier) qualifierForPossibleConversion; + return copyWithUriQualifier(identifierQualifierToConvert, objectCopyFactory, qualifierConverter); + } + return objectToBeCopied; + } + + private static R copyWithUriQualifier(final IdentifierObjQualifier identifierQualifierToConvert, + final Function objectCopyFactory, + final ObjQualifierConverter qualifierConverter) { + return qualifierConverter.convertToUriQualifier(identifierQualifierToConvert) + .map(objectCopyFactory) + .orElseThrow(() -> buildExceptionForFailedConversion(identifierQualifierToConvert)); + } + + private static IllegalArgumentException buildExceptionForFailedConversion(final IdentifierObjQualifier qualifierFailedToConvert) { + return new IllegalArgumentException(format("Supplied converter does not provide conversion for '%s'!", qualifierFailedToConvert)); + } + +} diff --git a/src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java b/src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java new file mode 100644 index 000000000..9227d78ab --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.executeafm.afm; + +import com.gooddata.executeafm.IdentifierObjQualifier; +import com.gooddata.executeafm.UriObjQualifier; + +import java.util.Optional; + +/** + * The interface of the function that converts {@link IdentifierObjQualifier} to the matching {@link UriObjQualifier}. + */ +@FunctionalInterface +public interface ObjQualifierConverter { + + /** + * Convert provided {@link IdentifierObjQualifier} to the matching {@link UriObjQualifier}. + * + * @param identifierObjQualifier + * The identifier that must be converted. + * + * @return The optional matching {@link UriObjQualifier} obtained by the conversion. + */ + Optional convertToUriQualifier(IdentifierObjQualifier identifierObjQualifier); +} diff --git a/src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java b/src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java new file mode 100644 index 000000000..6d2465754 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.io.Serializable; +import java.util.Objects; + +import static com.gooddata.util.Validate.notNull; + +/** + * Definition of the {@link OverPeriodMeasureDefinition} attribute. + */ +public class OverPeriodDateAttribute implements Serializable { + + private static final long serialVersionUID = 2311364644023464059L; + + private final ObjQualifier attribute; + private final Integer periodsAgo; + + /** + * Create a new instance of {@link OverPeriodDateAttribute}. + * + * @param attribute + * The {@link ObjQualifier} of the attribute from the date data set that defines the PoP period and date data set. The parameter must not be + * null. + * @param periodsAgo + * The number of periods defined by the {@code attribute} about which this period will be shifted about. The positive number shifts the period to + * the past, the negative to the future. The parameter must not be null. + * + * @throws IllegalArgumentException + * Thrown when one of the required parameter is null. + */ + @JsonCreator + public OverPeriodDateAttribute( + @JsonProperty("attribute") final ObjQualifier attribute, + @JsonProperty("periodsAgo") final Integer periodsAgo) { + this.attribute = notNull(attribute, "attribute"); + this.periodsAgo = notNull(periodsAgo, "periodsAgo"); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final OverPeriodDateAttribute that = (OverPeriodDateAttribute) o; + return Objects.equals(attribute, that.attribute) && + Objects.equals(periodsAgo, that.periodsAgo); + } + + @Override + public int hashCode() { + return Objects.hash(attribute, periodsAgo); + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + + /** + * The {@link ObjQualifier} of the attribute from the date data set that defines the PoP period. + * + * @return The date data set attribute that defines the PoP attribute. + */ + public ObjQualifier getAttribute() { + return attribute; + } + + /** + * The number of periods defined by the {@code attribute} about which this period will be shifted about. The positive number shifts the period to + * the past, the negative to the future. + * + * @return The number of periods the data will be shifted about. + */ + public Integer getPeriodsAgo() { + return periodsAgo; + } +} diff --git a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java new file mode 100644 index 000000000..7ed267eae --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static com.gooddata.executeafm.afm.OverPeriodMeasureDefinition.NAME; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * Definition of the period over period measure that is used for the Same period last year and Same period 2 years back comparisons. + */ +@JsonRootName(NAME) +public class OverPeriodMeasureDefinition implements MeasureDefinition, Serializable { + + private static final long serialVersionUID = -8904516814279504098L; + + static final String NAME = "overPeriodMeasure"; + + private final String measureIdentifier; + private final List dateAttributes; + + /** + * Create a new instance of {@link OverPeriodMeasureDefinition}. + * + * @param measureIdentifier + * The local identifier of the measure this PoP measure refers to. The parameter must not be null. + * @param dateAttributes + * The date attributes that defines how this measure will be shifted in time. The parameter must not be null. + * + * @throws IllegalArgumentException + * Thrown when {@code dateAttributes} list is empty or required parameter is null. + */ + @JsonCreator + public OverPeriodMeasureDefinition( + @JsonProperty("measureIdentifier") final String measureIdentifier, + @JsonProperty("dateAttributes") final List dateAttributes) { + this.measureIdentifier = notNull(measureIdentifier, "measureIdentifier"); + this.dateAttributes = notEmpty(dateAttributes, "dateAttributes"); + } + + /** + * The method is not supported by the object. + * Use {@link #getObjQualifiers()} instead. + * + * @return throws {@link UnsupportedOperationException} + * + * @throws UnsupportedOperationException + * The exception is thrown every time the method is called. + * @deprecated Use {@link #getObjQualifiers()} instead. + */ + @Override + @Deprecated + public ObjQualifier getObjQualifier() { + throw new UnsupportedOperationException("The method is not supported by the object!"); + } + + @Override + public Collection getObjQualifiers() { + return this.dateAttributes.stream() + .map(OverPeriodDateAttribute::getAttribute) + .collect(Collectors.toSet()); + } + + /** + * The method is not supported by the object. + * Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead. + * + * @param uriQualifier + * The URI object qualifier. + * + * @return throws {@link UnsupportedOperationException} + * + * @throws UnsupportedOperationException + * The exception is thrown every time the method is called. + * @deprecated Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead. + */ + @Override + @Deprecated + public MeasureDefinition withObjUriQualifier(final UriObjQualifier uriQualifier) { + throw new UnsupportedOperationException("The method is not supported by the object!"); + } + + @Override + public MeasureDefinition withObjUriQualifiers(final ObjQualifierConverter objQualifierConverter) { + notNull(objQualifierConverter, "objQualifierConverter"); + return new OverPeriodMeasureDefinition(measureIdentifier, copyAttributesWithUriQualifiers(objQualifierConverter)); + } + + private List copyAttributesWithUriQualifiers(final ObjQualifierConverter objQualifierConverter) { + return dateAttributes.stream() + .map(attribute -> copyWithUriQualifier(attribute, objQualifierConverter)) + .collect(Collectors.toList()); + } + + private OverPeriodDateAttribute copyWithUriQualifier(final OverPeriodDateAttribute attribute, final ObjQualifierConverter objQualifierConverter) { + return ObjIdentifierUtilities.copyIfNecessary( + attribute, + attribute.getAttribute(), + uriObjQualifier -> new OverPeriodDateAttribute(uriObjQualifier, attribute.getPeriodsAgo()), + objQualifierConverter + ); + } + + /** + * Determine if measure is ad-hoc, i.e., if it does not exist in the catalog and was created on fly. + * + * @return always true ({@link OverPeriodMeasureDefinition} is always ad-hoc) + */ + @Override + public boolean isAdHoc() { + return true; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final OverPeriodMeasureDefinition that = (OverPeriodMeasureDefinition) o; + return Objects.equals(measureIdentifier, that.measureIdentifier) && + Objects.equals(dateAttributes, that.dateAttributes); + } + + @Override + public int hashCode() { + return Objects.hash(measureIdentifier, dateAttributes); + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + + /** + * The local identifier of the measure this PoP measure refers to. + * + * @return The local identifier of the master measure. + */ + public String getMeasureIdentifier() { + return measureIdentifier; + } + + /** + * The date attributes that defines how this measure will be shifted in time. + * + * @return The list of date attributes. + */ + public List getDateAttributes() { + return dateAttributes; + } +} diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java index 5da1e7dd4..8a7b8d221 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java @@ -14,12 +14,20 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; +import java.util.Optional; import static com.gooddata.executeafm.afm.PopMeasureDefinition.NAME; /** - * Definition of so called "period over period" measure + * Definition of so called "period over period" measure. + *

+ * The definition is deprecated. Use {@link OverPeriodMeasureDefinition} with {@link OverPeriodDateAttribute#getPeriodsAgo()} set to {@code + * 1} instead. */ +@Deprecated @JsonRootName(NAME) @JsonInclude(JsonInclude.Include.NON_NULL) public class PopMeasureDefinition implements MeasureDefinition, Serializable { @@ -28,7 +36,6 @@ public class PopMeasureDefinition implements MeasureDefinition, Serializable { static final String NAME = "popMeasure"; private final String measureIdentifier; - private final ObjQualifier popAttribute; /** @@ -48,11 +55,18 @@ public PopMeasureDefinition(@JsonProperty("measureIdentifier") final String meas } @Override - public MeasureDefinition withObjUriQualifier(final UriObjQualifier qualifier) { - return new PopMeasureDefinition(measureIdentifier, qualifier); + public MeasureDefinition withObjUriQualifiers(final ObjQualifierConverter objQualifierConverter) { + return ObjIdentifierUtilities.copyIfNecessary( + this, + popAttribute, + uriObjQualifier -> new PopMeasureDefinition(measureIdentifier, uriObjQualifier), + objQualifierConverter + ); } /** + * Determine if measure is ad-hoc + * * @return always true (PopMeasure is always ad-hoc) */ @Override @@ -68,9 +82,56 @@ public ObjQualifier getPopAttribute() { return popAttribute; } + /** + * Returns the qualifier used by the {@link com.gooddata.md.Metric}. + * + * @return qualifier used by the metric, which is its {@link #popAttribute}. The null is returned in case when {@link #popAttribute} was not set. + * + * @deprecated Use {@link #getObjQualifiers()} instead. + */ @Override + @Deprecated public ObjQualifier getObjQualifier() { - return getPopAttribute(); + return getObjQualifiers().stream() + .findFirst() + .orElse(null); + } + + @Override + public Collection getObjQualifiers() { + return popAttribute == null + ? Collections.emptySet() + : Collections.singleton(popAttribute); + } + + /** + * Copy itself using given URI qualifier. + * + * @param uriQualifier + * The qualifier to use by the new object instead of the currently used one. + * + * @return self copy with given qualifier + * + * @deprecated Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead. + */ + @Override + @Deprecated + public MeasureDefinition withObjUriQualifier(final UriObjQualifier uriQualifier) { + return withObjUriQualifiers((identifierObjQualifier) -> Optional.of(uriQualifier)); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final PopMeasureDefinition that = (PopMeasureDefinition) o; + return Objects.equals(measureIdentifier, that.measureIdentifier) && + Objects.equals(popAttribute, that.popAttribute); + } + + @Override + public int hashCode() { + return Objects.hash(measureIdentifier, popAttribute); } @Override diff --git a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java new file mode 100644 index 000000000..34c5808f1 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.io.Serializable; +import java.util.Objects; + +import static com.gooddata.util.Validate.notNull; + +/** + * Definition of the {@link PreviousPeriodMeasureDefinition} data set. + */ +public class PreviousPeriodDateDataSet implements Serializable { + + private static final long serialVersionUID = 2311364644023464059L; + + private final ObjQualifier dataSet; + private final Integer periodsAgo; + + /** + * Create a new instance of {@link PreviousPeriodDateDataSet}. + * + * @param dataSet + * The {@link ObjQualifier} of the data set that match one of the {@link DateFilter} in the execution. The parameter must not be null. + * @param periodsAgo + * The number of periods defined by the matching date filter which this period will be shifted about. The positive number shifts the period to + * the past, the negative to the future. The parameter must not be null. + * + * @throws IllegalArgumentException + * Thrown when one of the required parameter is null. + */ + @JsonCreator + public PreviousPeriodDateDataSet( + @JsonProperty("dataSet") final ObjQualifier dataSet, + @JsonProperty("periodsAgo") final Integer periodsAgo) { + this.dataSet = notNull(dataSet, "dataSet"); + this.periodsAgo = notNull(periodsAgo, "periodsAgo"); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final PreviousPeriodDateDataSet that = (PreviousPeriodDateDataSet) o; + return Objects.equals(dataSet, that.dataSet) && + Objects.equals(periodsAgo, that.periodsAgo); + } + + @Override + public int hashCode() { + return Objects.hash(dataSet, periodsAgo); + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + + /** + * The {@link ObjQualifier} of the data set that match one of the {@link DateFilter} in the execution. + * + * @return The data set for matching of the AFM filter. + */ + public ObjQualifier getDataSet() { + return dataSet; + } + + /** + * The number of periods defined by the matching date filter which this period will be shifted about. The positive number shifts the period to + * the past, the negative to the future. + * + * @return The number of periods the data will be shifted about. + */ + public Integer getPeriodsAgo() { + return periodsAgo; + } +} diff --git a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java new file mode 100644 index 000000000..ee8a1678d --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static com.gooddata.executeafm.afm.PreviousPeriodMeasureDefinition.NAME; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * Definition of the period over period measure that is used for the Previous period comparison. + */ +@JsonRootName(NAME) +public class PreviousPeriodMeasureDefinition implements MeasureDefinition, Serializable { + + private static final long serialVersionUID = -4741355657671354062L; + + static final String NAME = "previousPeriodMeasure"; + + private final String measureIdentifier; + private final List dateDataSets; + + /** + * Create a new instance of {@link PreviousPeriodMeasureDefinition}. + * + * @param measureIdentifier + * The local identifier of the measure this PoP measure refers to. The parameter must not be null. + * @param dateDataSets + * The date data sets that defines how this measure will be shifted in time. The parameter must not be null. + * + * @throws IllegalArgumentException + * Thrown when {@code attributes} list is empty or required parameter is null. + */ + @JsonCreator + public PreviousPeriodMeasureDefinition( + @JsonProperty("measureIdentifier") final String measureIdentifier, + @JsonProperty("dateDataSets") final List dateDataSets) { + this.measureIdentifier = notNull(measureIdentifier, "measureIdentifier"); + this.dateDataSets = notEmpty(dateDataSets, "dateDataSets"); + } + + /** + * The method is not supported by the object. + * Use {@link #getObjQualifiers()} instead. + * + * @return throws {@link UnsupportedOperationException} + * + * @throws UnsupportedOperationException + * The exception is thrown every time the method is called. + * @deprecated Use {@link #getObjQualifiers()} instead. + */ + @Override + @Deprecated + public ObjQualifier getObjQualifier() { + throw new UnsupportedOperationException("The method is not supported by the object!"); + } + + @Override + public Collection getObjQualifiers() { + return this.dateDataSets.stream() + .map(PreviousPeriodDateDataSet::getDataSet) + .collect(Collectors.toSet()); + } + + /** + * The method is not supported by the object. + * Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead. + * + * @param uriQualifier + * The URI object qualifier. + * + * @return throws {@link UnsupportedOperationException} + * + * @throws UnsupportedOperationException + * The exception is thrown every time the method is called. + * @deprecated Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead. + */ + @Override + @Deprecated + public MeasureDefinition withObjUriQualifier(final UriObjQualifier uriQualifier) { + throw new UnsupportedOperationException("The method is not supported by the object!"); + } + + @Override + public MeasureDefinition withObjUriQualifiers(final ObjQualifierConverter objQualifierConverter) { + notNull(objQualifierConverter, "objQualifierConverter"); + return new PreviousPeriodMeasureDefinition(measureIdentifier, copyDataSetsWithUriQualifiers(objQualifierConverter)); + } + + private List copyDataSetsWithUriQualifiers(final ObjQualifierConverter objQualifierConverter) { + return dateDataSets.stream() + .map(dataSet -> copyWithUriQualifier(dataSet, objQualifierConverter)) + .collect(Collectors.toList()); + } + + private PreviousPeriodDateDataSet copyWithUriQualifier(final PreviousPeriodDateDataSet dataSet, final ObjQualifierConverter objQualifierConverter) { + return ObjIdentifierUtilities.copyIfNecessary( + dataSet, + dataSet.getDataSet(), + uriObjQualifier -> new PreviousPeriodDateDataSet(uriObjQualifier, dataSet.getPeriodsAgo()), + objQualifierConverter + ); + } + + /** + * Determine if measure is ad-hoc, i.e., if it does not exist in the catalog and was created on fly. + * + * @return always true ({@link PreviousPeriodMeasureDefinition} is always ad-hoc) + */ + @Override + public boolean isAdHoc() { + return true; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final PreviousPeriodMeasureDefinition that = (PreviousPeriodMeasureDefinition) o; + return Objects.equals(measureIdentifier, that.measureIdentifier) && + Objects.equals(dateDataSets, that.dateDataSets); + } + + @Override + public int hashCode() { + return Objects.hash(measureIdentifier, dateDataSets); + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + + /** + * The local identifier of the measure this PoP measure refers to. + * + * @return The local identifier of the master measure. + */ + public String getMeasureIdentifier() { + return measureIdentifier; + } + + /** + * The date data sets that defines how this measure will be shifted in time. + * + * @return The list of date data sets. + */ + public List getDateDataSets() { + return dateDataSets; + } +} diff --git a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java index 219be64e2..08f68a3cd 100644 --- a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java @@ -15,8 +15,11 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; import static com.gooddata.executeafm.afm.SimpleMeasureDefinition.NAME; import static com.gooddata.util.Validate.notNull; @@ -43,10 +46,15 @@ public SimpleMeasureDefinition(final ObjQualifier item) { /** * Creates new definition - * @param item item which is measured, can be attribute, fact or another measure - * @param aggregation additional aggregation applied - * @param computeRatio whether should be shown as ratio - * @param filters additional filters applied + * + * @param item + * item which is measured, can be attribute, fact or another measure + * @param aggregation + * additional aggregation applied + * @param computeRatio + * whether should be shown as ratio + * @param filters + * additional filters applied */ @JsonCreator public SimpleMeasureDefinition(@JsonProperty("item") final ObjQualifier item, @@ -61,10 +69,15 @@ public SimpleMeasureDefinition(@JsonProperty("item") final ObjQualifier item, /** * Creates new definition - * @param item item which is measured, can be attribute, fact or another measure - * @param aggregation additional aggregation applied - * @param computeRatio whether should be shown as ratio - * @param filters additional filters applied + * + * @param item + * item which is measured, can be attribute, fact or another measure + * @param aggregation + * additional aggregation applied + * @param computeRatio + * whether should be shown as ratio + * @param filters + * additional filters applied */ public SimpleMeasureDefinition(final ObjQualifier item, final Aggregation aggregation, final Boolean computeRatio, final List filters) { @@ -73,19 +86,28 @@ public SimpleMeasureDefinition(final ObjQualifier item, final Aggregation aggreg /** * Creates new definition - * @param item item which is measured, can be attribute, fact or another measure - * @param aggregation additional aggregation applied - * @param computeRatio whether should be shown as ratio - * @param filters additional filters applied + * + * @param item + * item which is measured, can be attribute, fact or another measure + * @param aggregation + * additional aggregation applied + * @param computeRatio + * whether should be shown as ratio + * @param filters + * additional filters applied */ - public SimpleMeasureDefinition(final ObjQualifier item, final Aggregation aggregation, final Boolean computeRatio, - final FilterItem... filters) { + public SimpleMeasureDefinition(final ObjQualifier item, final Aggregation aggregation, final Boolean computeRatio, final FilterItem... filters) { this(item, aggregation, computeRatio, asList(filters)); } @Override - public MeasureDefinition withObjUriQualifier(final UriObjQualifier qualifier) { - return new SimpleMeasureDefinition(qualifier, aggregation, computeRatio, filters); + public MeasureDefinition withObjUriQualifiers(final ObjQualifierConverter objQualifierConverter) { + return ObjIdentifierUtilities.copyIfNecessary( + this, + item, + uriObjQualifier -> new SimpleMeasureDefinition(uriObjQualifier, aggregation, computeRatio, filters), + objQualifierConverter + ); } @Override @@ -98,9 +120,42 @@ public String getUri() { return getItem().getUri(); } + /** + * Returns the qualifier used by the {@link com.gooddata.md.Metric}. + * + * @return qualifier used by the metric, which is its {@link #item}. The null is returned in case when {@link #item} was not set. + * + * @deprecated Use {@link #getObjQualifiers()} instead. + */ @Override + @Deprecated public ObjQualifier getObjQualifier() { - return getItem(); + return getObjQualifiers().stream() + .findFirst() + .orElse(null); + } + + @Override + public Collection getObjQualifiers() { + return item == null + ? Collections.emptySet() + : Collections.singleton(item); + } + + /** + * Copy itself using given URI qualifier. + * + * @param uriQualifier + * The qualifier to use by the new object instead of the currently used one. + * + * @return self copy with given qualifier + * + * @deprecated Use {@link #withObjUriQualifiers(ObjQualifierConverter)} instead. + */ + @Override + @Deprecated + public MeasureDefinition withObjUriQualifier(final UriObjQualifier uriQualifier) { + return withObjUriQualifiers((identifierObjQualifier) -> Optional.of(uriQualifier)); } /** @@ -119,7 +174,9 @@ public String getAggregation() { /** * Set additional aggregation applied - * @param aggregation additional aggregation applied + * + * @param aggregation + * additional aggregation applied */ public void setAggregation(final String aggregation) { this.aggregation = aggregation; @@ -127,7 +184,9 @@ public void setAggregation(final String aggregation) { /** * Set additional aggregation applied - * @param aggregation additional aggregation applied + * + * @param aggregation + * additional aggregation applied */ public void setAggregation(final Aggregation aggregation) { setAggregation(notNull(aggregation, "aggregation").toString()); @@ -142,7 +201,9 @@ public Boolean getComputeRatio() { /** * Set whether should be shown as ratio - * @param computeRatio whether should be shown as ratio + * + * @param computeRatio + * whether should be shown as ratio */ public void setComputeRatio(final Boolean computeRatio) { this.computeRatio = computeRatio; @@ -157,7 +218,9 @@ public List getFilters() { /** * Set additional filters applied - * @param filters additional filters applied + * + * @param filters + * additional filters applied */ public void setFilters(final List filters) { this.filters = filters; @@ -165,7 +228,9 @@ public void setFilters(final List filters) { /** * Apply additional filter - * @param filter filter to be applied + * + * @param filter + * filter to be applied */ public void addFilter(final FilterItem filter) { if (filters == null) { @@ -195,6 +260,22 @@ public boolean hasAggregation() { return aggregation != null; } + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final SimpleMeasureDefinition that = (SimpleMeasureDefinition) o; + return Objects.equals(item, that.item) && + Objects.equals(aggregation, that.aggregation) && + Objects.equals(computeRatio, that.computeRatio) && + Objects.equals(filters, that.filters); + } + + @Override + public int hashCode() { + return Objects.hash(item, aggregation, computeRatio, filters); + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/test/groovy/com/gooddata/executeafm/afm/MeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/MeasureDefinitionTest.groovy index e6a50335b..cb4c8f2c0 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/MeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/MeasureDefinitionTest.groovy @@ -21,9 +21,11 @@ class MeasureDefinitionTest extends Specification { typeClass.isInstance(instance) where: - type | typeClass - 'popMeasureDefinition' | PopMeasureDefinition - 'simpleMeasureDefinition' | SimpleMeasureDefinition + type | typeClass + 'popMeasureDefinition' | PopMeasureDefinition + 'simpleMeasureDefinition' | SimpleMeasureDefinition + 'overPeriodMeasureDefinition' | OverPeriodMeasureDefinition + 'previousPeriodMeasureDefinition' | PreviousPeriodMeasureDefinition } def "getUri() should throw exception"() { diff --git a/src/test/groovy/com/gooddata/executeafm/afm/ObjIdentifierUtilitiesTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/ObjIdentifierUtilitiesTest.groovy new file mode 100644 index 000000000..c11389dbd --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/afm/ObjIdentifierUtilitiesTest.groovy @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.executeafm.afm + +import com.gooddata.executeafm.IdentifierObjQualifier +import com.gooddata.executeafm.ObjQualifier +import com.gooddata.executeafm.UriObjQualifier +import spock.lang.Specification + +class ObjIdentifierUtilitiesTest extends Specification { + + + def "should throw when required parameter is null"() { + when: + ObjIdentifierUtilities.copyIfNecessary(objectToCopy, qualifier, copyFactory, converter) + + then: + thrown(IllegalArgumentException) + + where: + objectToCopy | qualifier | copyFactory | converter + null | new IdentifierObjQualifier("id") | { uri -> "new string" } | { id -> new UriObjQualifier("/uri") } + "string" | null | { uri -> "new string" } | { id -> new UriObjQualifier("/uri") } + "string" | new IdentifierObjQualifier("id") | null | { id -> new UriObjQualifier("/uri") } + "string" | new IdentifierObjQualifier("id") | { uri -> "new string" } | null + } + + def "should throw when uri conversion failed"() { + given: + SomeClass original = new SomeClass(new IdentifierObjQualifier("id")) + def copyFactory = { uriQualifier -> new SomeClass(uriQualifier) } + def qualifiersConversionMap = [ + (new IdentifierObjQualifier("another-id")): new UriObjQualifier("/uri") + ] + ObjQualifierConverter qualifierConverter = { identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + } + + when: + ObjIdentifierUtilities.copyIfNecessary(original, original.qualifier, copyFactory, qualifierConverter) + + then: + thrown(IllegalArgumentException) + } + + def "should return copied object with result of the qualifier result"() { + given: + SomeClass original = new SomeClass(new IdentifierObjQualifier("id")) + def copyFactory = { uriQualifier -> new SomeClass(uriQualifier) } + def qualifiersConversionMap = [ + (new IdentifierObjQualifier("id")): new UriObjQualifier("/uri") + ] + ObjQualifierConverter qualifierConverter = { identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + } + + when: + SomeClass copy = ObjIdentifierUtilities.copyIfNecessary(original, original.qualifier, copyFactory, qualifierConverter) + + then: + copy == new SomeClass(new UriObjQualifier("/uri")) + } + + def "should return the original object when it already uses the uri qualifier"() { + given: + SomeClass original = new SomeClass(new UriObjQualifier("/uri")) + def copyFactory = { uriQualifier -> new SomeClass(uriQualifier) } + def qualifiersConversionMap = [ + (new IdentifierObjQualifier("id")): new UriObjQualifier("/another-uri") + ] + ObjQualifierConverter qualifierConverter = { identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + } + + when: + SomeClass copy = ObjIdentifierUtilities.copyIfNecessary(original, original.qualifier, copyFactory, qualifierConverter) + + then: + original == copy + } + + private class SomeClass { + + private ObjQualifier qualifier + + SomeClass(ObjQualifier qualifier) { + this.qualifier = qualifier + } + + boolean equals(final o) { + if (this.is(o)) return true + if (getClass() != o.class) return false + SomeClass someClass = (SomeClass) o + if (qualifier != someClass.qualifier) return false + return true + } + + int hashCode() { + return (qualifier != null ? qualifier.hashCode() : 0) + } + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/afm/OverPeriodDateAttributeTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/OverPeriodDateAttributeTest.groovy new file mode 100644 index 000000000..62ee1330c --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/afm/OverPeriodDateAttributeTest.groovy @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm + +import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class OverPeriodDateAttributeTest extends Specification { + + private static final String ATTRIBUTE_JSON = "executeafm/afm/overPeriodDateAttribute.json" + + def "should serialize"() { + expect: + OverPeriodDateAttribute dateAttribute = new OverPeriodDateAttribute( + new UriObjQualifier('/gdc/md/projectId/obj/1'), 2) + that dateAttribute, jsonEquals(resource(ATTRIBUTE_JSON)) + } + + def "should deserialize"() { + when: + OverPeriodDateAttribute dateAttribute = readObjectFromResource("/$ATTRIBUTE_JSON", OverPeriodDateAttribute) + + then: + dateAttribute.attribute.uri == '/gdc/md/projectId/obj/1' + dateAttribute.periodsAgo == 2 + } + + def "test serializable"() { + given: + OverPeriodDateAttribute dateAttribute = readObjectFromResource("/$ATTRIBUTE_JSON", OverPeriodDateAttribute) + OverPeriodDateAttribute deserialized = SerializationUtils.roundtrip(dateAttribute) + + expect: + that deserialized, jsonEquals(dateAttribute) + } + + def "should throw when required construction parameter is null"() { + when: + new OverPeriodDateAttribute(attribute, periodsAgo) + + then: + thrown(IllegalArgumentException) + + where: + attribute | periodsAgo + null | 2 + new UriObjQualifier('/gdc/md/projectId/obj/1') | null + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(OverPeriodDateAttribute) + .usingGetClass() + .verify() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/afm/OverPeriodMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/OverPeriodMeasureDefinitionTest.groovy new file mode 100644 index 000000000..67072cb91 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/afm/OverPeriodMeasureDefinitionTest.groovy @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm + +import com.gooddata.executeafm.IdentifierObjQualifier +import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class OverPeriodMeasureDefinitionTest extends Specification { + + private static final String path = 'executeafm/afm' + private static final String SINGLE_ATTRIBUTE_JSON = "$path/overPeriodMeasureDefinition.json" + private static final String TWO_ATTRIBUTES_JSON = "$path/overPeriodMeasureDefinitionWithTwoAttributes.json" + + def "should serialize"() { + expect: + OverPeriodMeasureDefinition measure = new OverPeriodMeasureDefinition( + 'mId', [new OverPeriodDateAttribute(new UriObjQualifier('/gdc/md/projectId/obj/1'), 2)] + ) + that measure, jsonEquals(resource(SINGLE_ATTRIBUTE_JSON)) + } + + def "should deserialize when single attribute is provided"() { + when: + OverPeriodMeasureDefinition measure = readObjectFromResource("/$SINGLE_ATTRIBUTE_JSON", OverPeriodMeasureDefinition) + + then: + measure.measureIdentifier == 'mId' + measure.getObjQualifiers()[0].uri == '/gdc/md/projectId/obj/1' + measure.dateAttributes.size() == 1 + measure.dateAttributes[0].periodsAgo == 2 + measure.dateAttributes[0].attribute.uri == '/gdc/md/projectId/obj/1' + measure.isAdHoc() + measure.toString() + } + + def "should deserialize when more attributes are provided"() { + when: + OverPeriodMeasureDefinition measure = readObjectFromResource("/$TWO_ATTRIBUTES_JSON", OverPeriodMeasureDefinition) + + then: + measure.measureIdentifier == 'mId' + measure.getObjQualifiers()[0].uri == '/gdc/md/projectId/obj/1' + measure.getObjQualifiers()[1].uri == '/gdc/md/projectId/obj/2' + measure.dateAttributes.size() == 2 + measure.dateAttributes[0].periodsAgo == 2 + measure.dateAttributes[0].attribute.uri == '/gdc/md/projectId/obj/1' + measure.dateAttributes[1].periodsAgo == 1 + measure.dateAttributes[1].attribute.uri == '/gdc/md/projectId/obj/2' + measure.isAdHoc() + measure.toString() + } + + def "test serializable"() { + given: + OverPeriodMeasureDefinition measureDefinition = readObjectFromResource("/$SINGLE_ATTRIBUTE_JSON", OverPeriodMeasureDefinition) + OverPeriodMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) + + expect: + that deserialized, jsonEquals(measureDefinition) + } + + def "should throw when required construction parameter is null or empty"() { + when: + new OverPeriodMeasureDefinition(measureIdentifier, dateAttributes) + + then: + thrown(IllegalArgumentException) + + where: + measureIdentifier | dateAttributes + 'mId' | null + 'mId' | [] + null | [new OverPeriodDateAttribute(new UriObjQualifier('/gdc/md/projectId/obj/1'), 2)] + } + + def "should throw when getting used object qualifiers via deprecated method"() { + when: + OverPeriodMeasureDefinition measure = new OverPeriodMeasureDefinition('mId', [ + new OverPeriodDateAttribute(new IdentifierObjQualifier('id1'), -2), + ]) + measure.getObjQualifier() + then: + thrown(UnsupportedOperationException) + } + + def "should throw when try to copy with uri via deprecated method"() { + when: + OverPeriodMeasureDefinition measure = new OverPeriodMeasureDefinition('mId', [ + new OverPeriodDateAttribute(new IdentifierObjQualifier('id1'), -2), + ]) + measure.withObjUriQualifier(new UriObjQualifier("/gdc/md/projectId/obj/1")) + then: + thrown(UnsupportedOperationException) + } + + def "should copy with uri converter"() { + when: + OverPeriodMeasureDefinition measure = new OverPeriodMeasureDefinition('mId', [ + new OverPeriodDateAttribute(new IdentifierObjQualifier('id1'), -2), + new OverPeriodDateAttribute(new IdentifierObjQualifier('id2'), -3), + new OverPeriodDateAttribute(new UriObjQualifier('/gdc/md/projectId/obj/3'), -4) + ]) + def qualifiersConversionMap = [ + (new IdentifierObjQualifier("id2")): new UriObjQualifier("/gdc/md/projectId/obj/2"), + (new IdentifierObjQualifier("id1")): new UriObjQualifier("/gdc/md/projectId/obj/1") + ] + def copy = measure.withObjUriQualifiers({ identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + }) + + then: + measure.measureIdentifier == 'mId' + copy.dateAttributes[0].attribute.uri == '/gdc/md/projectId/obj/1' + copy.dateAttributes[0].periodsAgo == -2 + copy.dateAttributes[1].attribute.uri == '/gdc/md/projectId/obj/2' + copy.dateAttributes[1].periodsAgo == -3 + copy.dateAttributes[2].attribute.uri == '/gdc/md/projectId/obj/3' + copy.dateAttributes[2].periodsAgo == -4 + } + + def "should fail when qualifier converter is not provided or cannot convert object's identifier qualifiers"() { + when: + OverPeriodMeasureDefinition measure = new OverPeriodMeasureDefinition('mId', [ + new OverPeriodDateAttribute(new IdentifierObjQualifier('id1'), -2) + ]) + measure.withObjUriQualifiers(invalidObjQualifierConverter) + + then: + thrown(IllegalArgumentException) + + where: + invalidObjQualifierConverter << [null, { identifierQualifier -> Optional.empty() }] + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(OverPeriodMeasureDefinition) + .usingGetClass() + .verify() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy index 6372e6262..4a0d56163 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy @@ -7,6 +7,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import nl.jqno.equalsverifier.Warning import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification @@ -31,12 +33,13 @@ class PopMeasureDefinitionTest extends Specification { then: measure.measureIdentifier == 'mId' - (measure.popAttribute as UriObjQualifier).uri == '/gdc/md/projectId/obj/1' + measure.popAttribute.uri == '/gdc/md/projectId/obj/1' + measure.objQualifier.uri == '/gdc/md/projectId/obj/1' measure.isAdHoc() measure.toString() } - def "should copy"() { + def "should copy with uri"() { when: def measure = new PopMeasureDefinition("mid", new IdentifierObjQualifier("id")) def copy = measure.withObjUriQualifier(new UriObjQualifier("uri")) @@ -45,7 +48,41 @@ class PopMeasureDefinitionTest extends Specification { copy.objQualifier.uri == 'uri' } + def "should copy with uri converter"() { + when: + def measure = new PopMeasureDefinition("mid", new IdentifierObjQualifier("id")) + def qualifiersConversionMap = [(new IdentifierObjQualifier("id")): new UriObjQualifier("uri")] + def copy = measure.withObjUriQualifiers({ identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + }) + + then: + copy.popAttribute.uri == 'uri' + } + + def "should return the same object when copying with uri converter and uri is already used"() { + when: + def definition = new PopMeasureDefinition("mid", new UriObjQualifier("uri")) + def copy = definition.withObjUriQualifiers({ identifierQualifier -> Optional.empty() }) + + then: + definition == copy + } + + def "should fail when qualifier converter is not provided or cannot convert object's identifier qualifiers"() { + when: + def measure = new PopMeasureDefinition("mid", new IdentifierObjQualifier("id")) + measure.withObjUriQualifiers(invalidObjQualifierConverter) + + then: + thrown(IllegalArgumentException) + + where: + invalidObjQualifierConverter << [null, { identifierQualifier -> Optional.empty() }] + } + def "test serializable"() { + given: PopMeasureDefinition measureDefinition = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition) PopMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) @@ -53,4 +90,28 @@ class PopMeasureDefinitionTest extends Specification { that deserialized, jsonEquals(measureDefinition) } + def "should verify equals"() { + expect: + EqualsVerifier.forClass(PopMeasureDefinition) + .usingGetClass() + .verify() + } + + def "should return null when qualifier is requested but was not set"() { + when: + def definition = new PopMeasureDefinition("mid", null) + def qualifier = definition.getObjQualifier() + + then: + qualifier == null + } + + def "should return empty collection when qualifiers are requested but none was set"() { + when: + def definition = new PopMeasureDefinition("mid", null) + def qualifiers = definition.getObjQualifiers() + + then: + qualifiers.size() == 0 + } } diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodDateDataSetTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodDateDataSetTest.groovy new file mode 100644 index 000000000..c83958739 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodDateDataSetTest.groovy @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm + +import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class PreviousPeriodDateDataSetTest extends Specification { + + private static final String DATA_SET_JSON = "executeafm/afm/previousPeriodDateDataSet.json" + + def "should serialize"() { + expect: + PreviousPeriodDateDataSet dateDataSet = new PreviousPeriodDateDataSet( + new UriObjQualifier('/gdc/md/projectId/obj/1'), 2) + that dateDataSet, jsonEquals(resource(DATA_SET_JSON)) + } + + def "should deserialize"() { + when: + PreviousPeriodDateDataSet dateDataSet = readObjectFromResource("/$DATA_SET_JSON", PreviousPeriodDateDataSet) + + then: + dateDataSet.dataSet.uri == '/gdc/md/projectId/obj/1' + dateDataSet.periodsAgo == 2 + } + + def "test serializable"() { + given: + PreviousPeriodDateDataSet dateDataSet = readObjectFromResource("/$DATA_SET_JSON", PreviousPeriodDateDataSet) + PreviousPeriodDateDataSet deserialized = SerializationUtils.roundtrip(dateDataSet) + + expect: + that deserialized, jsonEquals(dateDataSet) + } + + def "should throw when required construction parameter is null"() { + when: + new PreviousPeriodDateDataSet(dateDataSet, periodsAgo) + + then: + thrown(IllegalArgumentException) + + where: + dateDataSet | periodsAgo + null | 2 + new UriObjQualifier('/gdc/md/projectId/obj/1') | null + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(PreviousPeriodDateDataSet) + .usingGetClass() + .verify() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinitionTest.groovy new file mode 100644 index 000000000..0c6d84c9e --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinitionTest.groovy @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm + +import com.gooddata.executeafm.IdentifierObjQualifier +import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import org.apache.commons.lang3.SerializationUtils +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class PreviousPeriodMeasureDefinitionTest extends Specification { + + private static final String path = 'executeafm/afm' + private static final String SINGLE_DATA_SET_JSON = "$path/previousPeriodMeasureDefinition.json" + private static final String TWO_DATA_SETS_JSON = "$path/previousPeriodMeasureDefinitionWithTwoDataSets.json" + + def "should serialize"() { + expect: + PreviousPeriodMeasureDefinition measure = new PreviousPeriodMeasureDefinition( + 'mId', [new PreviousPeriodDateDataSet(new UriObjQualifier('/gdc/md/projectId/obj/1'), 2)] + ) + that measure, jsonEquals(resource(SINGLE_DATA_SET_JSON)) + } + + def "should deserialize when single attribute is provided"() { + when: + PreviousPeriodMeasureDefinition measure = readObjectFromResource("/$SINGLE_DATA_SET_JSON", PreviousPeriodMeasureDefinition) + + then: + measure.measureIdentifier == 'mId' + measure.getObjQualifiers()[0].uri == '/gdc/md/projectId/obj/1' + measure.dateDataSets.size() == 1 + measure.dateDataSets[0].periodsAgo == 2 + measure.dateDataSets[0].dataSet.uri == '/gdc/md/projectId/obj/1' + measure.isAdHoc() + measure.toString() + } + + def "should deserialize when more attributes are provided"() { + when: + PreviousPeriodMeasureDefinition measure = readObjectFromResource("/$TWO_DATA_SETS_JSON", PreviousPeriodMeasureDefinition) + + then: + measure.measureIdentifier == 'mId' + measure.getObjQualifiers()[0].uri == '/gdc/md/projectId/obj/1' + measure.getObjQualifiers()[1].uri == '/gdc/md/projectId/obj/2' + measure.dateDataSets.size() == 2 + measure.dateDataSets[0].periodsAgo == 2 + measure.dateDataSets[0].dataSet.uri == '/gdc/md/projectId/obj/1' + measure.dateDataSets[1].periodsAgo == 1 + measure.dateDataSets[1].dataSet.uri == '/gdc/md/projectId/obj/2' + measure.isAdHoc() + measure.toString() + } + + def "test serializable"() { + given: + PreviousPeriodMeasureDefinition measureDefinition = readObjectFromResource("/$SINGLE_DATA_SET_JSON", PreviousPeriodMeasureDefinition) + PreviousPeriodMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) + + expect: + that deserialized, jsonEquals(measureDefinition) + } + + def "should throw when required construction parameter is null or empty"() { + when: + new PreviousPeriodMeasureDefinition(measureIdentifier, dateDataSets) + + then: + thrown(IllegalArgumentException) + + where: + measureIdentifier | dateDataSets + 'mId' | null + 'mId' | [] + null | [new PreviousPeriodDateDataSet(new UriObjQualifier('/gdc/md/projectId/obj/1'), 2)] + } + + def "should throw when getting used object qualifiers via deprecated method"() { + when: + PreviousPeriodMeasureDefinition measure = new PreviousPeriodMeasureDefinition('mId', [ + new PreviousPeriodDateDataSet(new IdentifierObjQualifier('id1'), -2), + ]) + measure.getObjQualifier() + + then: + thrown(UnsupportedOperationException) + } + + def "should throw when try to copy with uri via deprecated method"() { + when: + PreviousPeriodMeasureDefinition measure = new PreviousPeriodMeasureDefinition('mId', [ + new PreviousPeriodDateDataSet(new IdentifierObjQualifier('id1'), -2), + ]) + measure.withObjUriQualifier(new UriObjQualifier("/gdc/md/projectId/obj/1")) + + then: + thrown(UnsupportedOperationException) + } + + def "should copy with uri converter"() { + when: + PreviousPeriodMeasureDefinition measure = new PreviousPeriodMeasureDefinition('mId', [ + new PreviousPeriodDateDataSet(new IdentifierObjQualifier('id1'), -2), + new PreviousPeriodDateDataSet(new IdentifierObjQualifier('id2'), -3), + new PreviousPeriodDateDataSet(new UriObjQualifier('/gdc/md/projectId/obj/3'), -4) + ]) + def qualifiersConversionMap = [ + (new IdentifierObjQualifier("id2")): new UriObjQualifier("/gdc/md/projectId/obj/2"), + (new IdentifierObjQualifier("id1")): new UriObjQualifier("/gdc/md/projectId/obj/1") + ] + def copy = measure.withObjUriQualifiers({ identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + }) + + then: + measure.measureIdentifier == 'mId' + copy.dateDataSets[0].dataSet.uri == '/gdc/md/projectId/obj/1' + copy.dateDataSets[0].periodsAgo == -2 + copy.dateDataSets[1].dataSet.uri == '/gdc/md/projectId/obj/2' + copy.dateDataSets[1].periodsAgo == -3 + copy.dateDataSets[2].dataSet.uri == '/gdc/md/projectId/obj/3' + copy.dateDataSets[2].periodsAgo == -4 + } + + def "should fail when qualifier converter is not provided or cannot convert object's identifier qualifiers"() { + when: + PreviousPeriodMeasureDefinition measure = new PreviousPeriodMeasureDefinition('mId', [ + new PreviousPeriodDateDataSet(new IdentifierObjQualifier('id1'), -2) + ]) + measure.withObjUriQualifiers(invalidObjQualifierConverter) + + then: + thrown(IllegalArgumentException) + + where: + invalidObjQualifierConverter << [null, { identifierQualifier -> Optional.empty() }] + } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(PreviousPeriodMeasureDefinition) + .usingGetClass() + .verify() + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy index 29c6bcb5c..f8716bad7 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/SimpleMeasureDefinitionTest.groovy @@ -7,6 +7,8 @@ package com.gooddata.executeafm.afm import com.gooddata.executeafm.IdentifierObjQualifier import com.gooddata.executeafm.UriObjQualifier +import nl.jqno.equalsverifier.EqualsVerifier +import nl.jqno.equalsverifier.Warning import org.apache.commons.lang3.SerializationUtils import spock.lang.Specification @@ -25,7 +27,7 @@ class SimpleMeasureDefinitionTest extends Specification { def "should serialize full"() { expect: that new SimpleMeasureDefinition(QUALIFIER, Aggregation.AVG, - true, new PositiveAttributeFilter(QUALIFIER,'foo'), new NegativeAttributeFilter(QUALIFIER, 'foo')), + true, new PositiveAttributeFilter(QUALIFIER, 'foo'), new NegativeAttributeFilter(QUALIFIER, 'foo')), jsonEquals(resource(SIMPLE_MEASURE_DEFINITION_FULL_JSON)) } @@ -53,6 +55,9 @@ class SimpleMeasureDefinitionTest extends Specification { with(definition?.item as UriObjQualifier) { uri == QUALIFIER.uri } + with(definition?.objQualifier as UriObjQualifier) { + uri == QUALIFIER.uri + } definition?.aggregation == 'avg' definition?.computeRatio with(definition?.filters?.find { it.class == PositiveAttributeFilter }) { @@ -108,11 +113,72 @@ class SimpleMeasureDefinitionTest extends Specification { copy.getObjQualifier().getUri() == 'uri' } + def "should copy with uri converter"() { + when: + def definition = new SimpleMeasureDefinition(new IdentifierObjQualifier("id")) + def qualifiersConversionMap = [(new IdentifierObjQualifier("id")): new UriObjQualifier("uri")] + def copy = definition.withObjUriQualifiers({ identifierQualifier -> + return Optional.ofNullable(qualifiersConversionMap.get(identifierQualifier)) + }) + + then: + copy.getUri() == 'uri' + copy.getItem().getUri() == 'uri' + } + + def "should return the same object when copying with uri converter and uri is already used"() { + when: + def definition = new SimpleMeasureDefinition(new UriObjQualifier('uri')) + def copy = definition.withObjUriQualifiers({ identifierQualifier -> Optional.empty() }) + + then: + definition == copy + } + + def "should fail when qualifier converter is not provided or cannot convert object's identifier qualifiers"() { + when: + def definition = new SimpleMeasureDefinition(new IdentifierObjQualifier("id")) + definition.withObjUriQualifiers(invalidObjQualifierConverter) + + then: + thrown(IllegalArgumentException) + + where: + invalidObjQualifierConverter << [null, { identifierQualifier -> Optional.empty() }] + } + def "test serializable"() { + given: SimpleMeasureDefinition measureDefinition = readObjectFromResource("/$SIMPLE_MEASURE_DEFINITION_FULL_JSON", SimpleMeasureDefinition) SimpleMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition) expect: that deserialized, jsonEquals(measureDefinition) } + + def "should verify equals"() { + expect: + EqualsVerifier.forClass(SimpleMeasureDefinition) + .suppress(Warning.NONFINAL_FIELDS) + .usingGetClass() + .verify() + } + + def "should return null when qualifier is requested but was not set"() { + when: + def definition = new SimpleMeasureDefinition(null) + def qualifier = definition.getObjQualifier() + + then: + qualifier == null + } + + def "should return empty collection when qualifiers are requested but none was set"() { + when: + def definition = new SimpleMeasureDefinition(null) + def qualifiers = definition.getObjQualifiers() + + then: + qualifiers.size() == 0 + } } diff --git a/src/test/resources/executeafm/afm/overPeriodDateAttribute.json b/src/test/resources/executeafm/afm/overPeriodDateAttribute.json new file mode 100644 index 000000000..afef8f361 --- /dev/null +++ b/src/test/resources/executeafm/afm/overPeriodDateAttribute.json @@ -0,0 +1,6 @@ +{ + "attribute": { + "uri": "/gdc/md/projectId/obj/1" + }, + "periodsAgo": 2 +} diff --git a/src/test/resources/executeafm/afm/overPeriodMeasureDefinition.json b/src/test/resources/executeafm/afm/overPeriodMeasureDefinition.json new file mode 100644 index 000000000..6d5f79c38 --- /dev/null +++ b/src/test/resources/executeafm/afm/overPeriodMeasureDefinition.json @@ -0,0 +1,13 @@ +{ + "overPeriodMeasure": { + "measureIdentifier": "mId", + "dateAttributes": [ + { + "attribute": { + "uri": "/gdc/md/projectId/obj/1" + }, + "periodsAgo": 2 + } + ] + } +} diff --git a/src/test/resources/executeafm/afm/overPeriodMeasureDefinitionWithTwoAttributes.json b/src/test/resources/executeafm/afm/overPeriodMeasureDefinitionWithTwoAttributes.json new file mode 100644 index 000000000..4e2ab45e1 --- /dev/null +++ b/src/test/resources/executeafm/afm/overPeriodMeasureDefinitionWithTwoAttributes.json @@ -0,0 +1,19 @@ +{ + "overPeriodMeasure": { + "measureIdentifier": "mId", + "dateAttributes": [ + { + "attribute": { + "uri": "/gdc/md/projectId/obj/1" + }, + "periodsAgo": 2 + }, + { + "attribute": { + "uri": "/gdc/md/projectId/obj/2" + }, + "periodsAgo": 1 + } + ] + } +} diff --git a/src/test/resources/executeafm/afm/previousPeriodDateDataSet.json b/src/test/resources/executeafm/afm/previousPeriodDateDataSet.json new file mode 100644 index 000000000..106d80fe8 --- /dev/null +++ b/src/test/resources/executeafm/afm/previousPeriodDateDataSet.json @@ -0,0 +1,6 @@ +{ + "dataSet": { + "uri": "/gdc/md/projectId/obj/1" + }, + "periodsAgo": 2 +} diff --git a/src/test/resources/executeafm/afm/previousPeriodMeasureDefinition.json b/src/test/resources/executeafm/afm/previousPeriodMeasureDefinition.json new file mode 100644 index 000000000..398bf7e8e --- /dev/null +++ b/src/test/resources/executeafm/afm/previousPeriodMeasureDefinition.json @@ -0,0 +1,13 @@ +{ + "previousPeriodMeasure": { + "measureIdentifier": "mId", + "dateDataSets": [ + { + "dataSet": { + "uri": "/gdc/md/projectId/obj/1" + }, + "periodsAgo": 2 + } + ] + } +} diff --git a/src/test/resources/executeafm/afm/previousPeriodMeasureDefinitionWithTwoDataSets.json b/src/test/resources/executeafm/afm/previousPeriodMeasureDefinitionWithTwoDataSets.json new file mode 100644 index 000000000..478935e73 --- /dev/null +++ b/src/test/resources/executeafm/afm/previousPeriodMeasureDefinitionWithTwoDataSets.json @@ -0,0 +1,19 @@ +{ + "previousPeriodMeasure": { + "measureIdentifier": "mId", + "dateDataSets": [ + { + "dataSet": { + "uri": "/gdc/md/projectId/obj/1" + }, + "periodsAgo": 2 + }, + { + "dataSet": { + "uri": "/gdc/md/projectId/obj/2" + }, + "periodsAgo": 1 + } + ] + } +} From d45f675fda1495c3cfdbd013149321c46ced3d14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 11 Jun 2018 11:11:46 +0200 Subject: [PATCH 074/548] Upgrade to httpclient 4.5.5 Note, that httpcore and httpclient versions are no longer aligned (released together). Resolves #423 --- README.md | 2 +- pom.xml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bb550b65d..0bfc7104f 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ and [Extensibility How-To](https://github.com/gooddata/gooddata-java/wiki/Extend The *GoodData Java SDK* uses: * the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) version 0.9.3 or later -* the *Apache HTTP Client* version 4.3 or later (for white-labeled domains at least version 4.3.2 is required) +* the *Apache HTTP Client* version 4.5 or later (for white-labeled domains at least version 4.3.2 is required) * the *Spring Framework* version 4.3.* * the *Jackson JSON Processor* version 2.8.* * the *Java Development Kit (JDK)* version 8 or later diff --git a/pom.xml b/pom.xml index 2da31fb8f..cb50d96b1 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,8 @@ - 4.3.3 + 4.5.5 + 4.4.9 2.8.11 2.8.11.1 4.3.1.RELEASE @@ -277,7 +278,7 @@ org.apache.httpcomponents httpcore - ${httpclient.version} + ${httpcore.version} org.springframework From b8321f91066eabe6c1c0a03e8b72db884f099525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 11 Jun 2018 13:46:27 +0200 Subject: [PATCH 075/548] Use gooddata-rest-common 1.2.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2da31fb8f..67eb228f1 100644 --- a/pom.xml +++ b/pom.xml @@ -257,7 +257,7 @@ com.gooddata gooddata-rest-common - 1.2.0 + 1.2.1 com.gooddata From da4b95b9a8efc9bb30970e2de42dd1b86f9402bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 11 Jun 2018 14:26:36 +0200 Subject: [PATCH 076/548] [maven-release-plugin] prepare release gooddata-java-2.26.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9258512f9..2faaa8099 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.25.2-SNAPSHOT + 2.26.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.26.0 From ec4fdedbbc1303649bd86d5cf52cd0f96a1fc6e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 11 Jun 2018 14:26:36 +0200 Subject: [PATCH 077/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2faaa8099..b0a1eac82 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.26.0 + 2.26.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.26.0 + HEAD From 8aede8673f4fc38c7a407b5de60b2966fd6fd493 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 15 Jun 2018 13:56:56 +0200 Subject: [PATCH 078/548] Use patched jackson-databind dependency See changelog: https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b0a1eac82..d7a584170 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ 4.5.5 4.4.9 2.8.11 - 2.8.11.1 + 2.8.11.2 4.3.1.RELEASE 1.1.1 1.23.0 From 1d45c72fb3de98a3d7c1c7bd7f31471cb4c3acc9 Mon Sep 17 00:00:00 2001 From: xMort Date: Mon, 25 Jun 2018 10:38:34 +0200 Subject: [PATCH 079/548] Introduce interface for derived measures --- .../afm/DerivedMeasureDefinition.java | 67 +++++++++++++++++++ .../afm/OverPeriodMeasureDefinition.java | 20 ++---- .../executeafm/afm/PopMeasureDefinition.java | 16 ++--- .../afm/PreviousPeriodMeasureDefinition.java | 20 ++---- 4 files changed, 83 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java diff --git a/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java new file mode 100644 index 000000000..bccd533bc --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +import java.io.Serializable; +import java.util.Objects; + +import static com.gooddata.util.Validate.notNull; + +/** + * The superclass of the {@link MeasureDefinition} classes that are derived from the master measure and have the identifier of the master measure. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonSubTypes({ + @JsonSubTypes.Type(value = PopMeasureDefinition.class, name = PopMeasureDefinition.NAME), + @JsonSubTypes.Type(value = OverPeriodMeasureDefinition.class, name = OverPeriodMeasureDefinition.NAME), + @JsonSubTypes.Type(value = PreviousPeriodMeasureDefinition.class, name = PreviousPeriodMeasureDefinition.NAME) +}) +public abstract class DerivedMeasureDefinition implements MeasureDefinition, Serializable { + + private static final long serialVersionUID = -1203802872091017113L; + + protected final String measureIdentifier; + + /** + * Create a new instance of {@link DerivedMeasureDefinition}. + * + * @param measureIdentifier + * The local identifier of the master measure this derived measure refers to. The parameter must not be null. + * + * @throws IllegalArgumentException + * Thrown when required parameter is null. + */ + DerivedMeasureDefinition(final String measureIdentifier) { + this.measureIdentifier = notNull(measureIdentifier, "measureIdentifier"); + } + + /** + * The local identifier of the master measure this derived measure refers to. + * + * @return The local identifier of the master measure. + */ + @JsonProperty + public String getMeasureIdentifier() { + return measureIdentifier; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final DerivedMeasureDefinition that = (DerivedMeasureDefinition) o; + return Objects.equals(measureIdentifier, that.measureIdentifier); + } + + @Override + public int hashCode() { + return Objects.hash(measureIdentifier); + } +} diff --git a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java index 7ed267eae..470b3a5a5 100644 --- a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java @@ -26,13 +26,12 @@ * Definition of the period over period measure that is used for the Same period last year and Same period 2 years back comparisons. */ @JsonRootName(NAME) -public class OverPeriodMeasureDefinition implements MeasureDefinition, Serializable { +public class OverPeriodMeasureDefinition extends DerivedMeasureDefinition implements Serializable { private static final long serialVersionUID = -8904516814279504098L; static final String NAME = "overPeriodMeasure"; - private final String measureIdentifier; private final List dateAttributes; /** @@ -50,7 +49,7 @@ public class OverPeriodMeasureDefinition implements MeasureDefinition, Serializa public OverPeriodMeasureDefinition( @JsonProperty("measureIdentifier") final String measureIdentifier, @JsonProperty("dateAttributes") final List dateAttributes) { - this.measureIdentifier = notNull(measureIdentifier, "measureIdentifier"); + super(measureIdentifier); this.dateAttributes = notEmpty(dateAttributes, "dateAttributes"); } @@ -131,14 +130,14 @@ public boolean isAdHoc() { public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; final OverPeriodMeasureDefinition that = (OverPeriodMeasureDefinition) o; - return Objects.equals(measureIdentifier, that.measureIdentifier) && - Objects.equals(dateAttributes, that.dateAttributes); + return Objects.equals(dateAttributes, that.dateAttributes); } @Override public int hashCode() { - return Objects.hash(measureIdentifier, dateAttributes); + return Objects.hash(super.hashCode(), dateAttributes); } @Override @@ -146,15 +145,6 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - /** - * The local identifier of the measure this PoP measure refers to. - * - * @return The local identifier of the master measure. - */ - public String getMeasureIdentifier() { - return measureIdentifier; - } - /** * The date attributes that defines how this measure will be shifted in time. * diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java index 8a7b8d221..79f316ae4 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java @@ -30,12 +30,12 @@ @Deprecated @JsonRootName(NAME) @JsonInclude(JsonInclude.Include.NON_NULL) -public class PopMeasureDefinition implements MeasureDefinition, Serializable { +public class PopMeasureDefinition extends DerivedMeasureDefinition implements Serializable { private static final long serialVersionUID = 1430640153994197345L; + static final String NAME = "popMeasure"; - private final String measureIdentifier; private final ObjQualifier popAttribute; /** @@ -50,7 +50,7 @@ public class PopMeasureDefinition implements MeasureDefinition, Serializable { @JsonCreator public PopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier, @JsonProperty("popAttribute") final ObjQualifier popAttribute) { - this.measureIdentifier = measureIdentifier; + super(measureIdentifier); this.popAttribute = popAttribute; } @@ -74,10 +74,6 @@ public boolean isAdHoc() { return true; } - public String getMeasureIdentifier() { - return measureIdentifier; - } - public ObjQualifier getPopAttribute() { return popAttribute; } @@ -124,14 +120,14 @@ public MeasureDefinition withObjUriQualifier(final UriObjQualifier uriQualifier) public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; final PopMeasureDefinition that = (PopMeasureDefinition) o; - return Objects.equals(measureIdentifier, that.measureIdentifier) && - Objects.equals(popAttribute, that.popAttribute); + return Objects.equals(popAttribute, that.popAttribute); } @Override public int hashCode() { - return Objects.hash(measureIdentifier, popAttribute); + return Objects.hash(super.hashCode(), popAttribute); } @Override diff --git a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java index ee8a1678d..80c5389e5 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java @@ -26,13 +26,12 @@ * Definition of the period over period measure that is used for the Previous period comparison. */ @JsonRootName(NAME) -public class PreviousPeriodMeasureDefinition implements MeasureDefinition, Serializable { +public class PreviousPeriodMeasureDefinition extends DerivedMeasureDefinition implements Serializable { private static final long serialVersionUID = -4741355657671354062L; static final String NAME = "previousPeriodMeasure"; - private final String measureIdentifier; private final List dateDataSets; /** @@ -50,7 +49,7 @@ public class PreviousPeriodMeasureDefinition implements MeasureDefinition, Seria public PreviousPeriodMeasureDefinition( @JsonProperty("measureIdentifier") final String measureIdentifier, @JsonProperty("dateDataSets") final List dateDataSets) { - this.measureIdentifier = notNull(measureIdentifier, "measureIdentifier"); + super(measureIdentifier); this.dateDataSets = notEmpty(dateDataSets, "dateDataSets"); } @@ -131,14 +130,14 @@ public boolean isAdHoc() { public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; final PreviousPeriodMeasureDefinition that = (PreviousPeriodMeasureDefinition) o; - return Objects.equals(measureIdentifier, that.measureIdentifier) && - Objects.equals(dateDataSets, that.dateDataSets); + return Objects.equals(dateDataSets, that.dateDataSets); } @Override public int hashCode() { - return Objects.hash(measureIdentifier, dateDataSets); + return Objects.hash(super.hashCode(), dateDataSets); } @Override @@ -146,15 +145,6 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - /** - * The local identifier of the measure this PoP measure refers to. - * - * @return The local identifier of the master measure. - */ - public String getMeasureIdentifier() { - return measureIdentifier; - } - /** * The date data sets that defines how this measure will be shifted in time. * From 1b8fcd7d3ef5ff4fe6f0428bc1d0bf0b88979c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 26 Jun 2018 09:13:37 +0200 Subject: [PATCH 080/548] Fix the releasing sed command both for Mac and GNU --- release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.sh b/release.sh index d15a687a1..c8c6e9703 100755 --- a/release.sh +++ b/release.sh @@ -61,6 +61,6 @@ then fi mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" -sed -i '' "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md +sed -i.bak "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md && rm -f README.md.bak git commit -a -m "bump version" git push origin --tags HEAD From 75e5efdfb72f75216bc658f56c79eeca365cad9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 26 Jun 2018 09:18:20 +0200 Subject: [PATCH 081/548] Sanitize failed mvn build when releasing Resolves #598 --- release.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/release.sh b/release.sh index c8c6e9703..5c174d854 100755 --- a/release.sh +++ b/release.sh @@ -61,6 +61,12 @@ then fi mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" +mvnRetVal=$? +if [ $mvnRetVal -ne 0 ]; then + echo "Mvn build failed - please fix it and try to release again" + exit $mvnRetVal +fi + sed -i.bak "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md && rm -f README.md.bak git commit -a -m "bump version" git push origin --tags HEAD From 412824d6c1fcca719094d2a816cd5e9a3a1cd08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 26 Jun 2018 11:19:22 +0200 Subject: [PATCH 082/548] [maven-release-plugin] prepare release gooddata-java-2.27.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d7a584170..d15e3adb4 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.26.1-SNAPSHOT + 2.27.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.27.0 From c94e9bea71a7a50329c55692f65e4cf660399dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 26 Jun 2018 11:19:22 +0200 Subject: [PATCH 083/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d15e3adb4..d763673e4 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.27.0 + 2.27.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.27.0 + HEAD From 5f48b3c77160e4d6d40f184309ef9897ae3b6090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Tue, 26 Jun 2018 11:23:56 +0200 Subject: [PATCH 084/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bfc7104f..15d434cff 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.25.0 + 2.27.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 462a416a82b698634d5452a3cf65cbb9c39f6493 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 13 Jul 2018 08:41:24 +0200 Subject: [PATCH 085/548] introduce totals measure sort locator in the execute AFM --- .../executeafm/resultspec/LocatorItem.java | 3 +- .../resultspec/TotalLocatorItem.java | 42 +++++++++++++++++++ .../resultspec/TotalLocatorItemTest.groovy | 36 ++++++++++++++++ .../resultspec/totalLocatorItem.json | 6 +++ 4 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java create mode 100644 src/test/groovy/com/gooddata/executeafm/resultspec/TotalLocatorItemTest.groovy create mode 100644 src/test/resources/executeafm/resultspec/totalLocatorItem.json diff --git a/src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java b/src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java index 6b07b03ee..3e20e279a 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java +++ b/src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java @@ -15,7 +15,8 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonSubTypes({ @JsonSubTypes.Type(value = AttributeLocatorItem.class, name = "attributeLocatorItem"), - @JsonSubTypes.Type(value = MeasureLocatorItem.class, name = "measureLocatorItem") + @JsonSubTypes.Type(value = MeasureLocatorItem.class, name = "measureLocatorItem"), + @JsonSubTypes.Type(value = TotalLocatorItem.class, name = "totalLocatorItem") }) public interface LocatorItem { } diff --git a/src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java b/src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java new file mode 100644 index 000000000..cda7ea269 --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.executeafm.resultspec; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; + +/** + * Holds total type and attribute to which this total corresponds. + * This enables sorting measure by specific totals. + */ +public class TotalLocatorItem implements LocatorItem { + + private final String attributeIdentifier; + private final String totalType; + + @JsonCreator + public TotalLocatorItem( + @JsonProperty("attributeIdentifier") String attributeIdentifier, + @JsonProperty("totalType") String totalType) { + this.attributeIdentifier = attributeIdentifier; + this.totalType = totalType; + } + + public String getAttributeIdentifier() { + return attributeIdentifier; + } + + public String getTotalType() { + return totalType; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } +} diff --git a/src/test/groovy/com/gooddata/executeafm/resultspec/TotalLocatorItemTest.groovy b/src/test/groovy/com/gooddata/executeafm/resultspec/TotalLocatorItemTest.groovy new file mode 100644 index 000000000..bb0ac3862 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/resultspec/TotalLocatorItemTest.groovy @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ + +package com.gooddata.executeafm.resultspec + +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + + +class TotalLocatorItemTest extends Specification { + + private static final String TOTAL_LOCATOR_ITEM_JSON = 'executeafm/resultspec/totalLocatorItem.json' + + def "should serialize"() { + expect: + that new TotalLocatorItem('aId', 'avg'), + jsonEquals(resource(TOTAL_LOCATOR_ITEM_JSON)) + } + + def "should deserialize"() { + when: + TotalLocatorItem item = readObjectFromResource("/$TOTAL_LOCATOR_ITEM_JSON".toString(), TotalLocatorItem) + + then: + item.attributeIdentifier == 'aId' + item.totalType == 'avg' + item.toString() + } +} diff --git a/src/test/resources/executeafm/resultspec/totalLocatorItem.json b/src/test/resources/executeafm/resultspec/totalLocatorItem.json new file mode 100644 index 000000000..288e326c6 --- /dev/null +++ b/src/test/resources/executeafm/resultspec/totalLocatorItem.json @@ -0,0 +1,6 @@ +{ + "totalLocatorItem": { + "attributeIdentifier": "aId", + "totalType": "avg" + } +} \ No newline at end of file From 59a9f6f40788f4f73d1afd89fc415a6b9e8d8b64 Mon Sep 17 00:00:00 2001 From: Tantalor93 Date: Tue, 10 Jul 2018 11:09:29 +0200 Subject: [PATCH 086/548] Add support for new arithmetic measure definition close #627 --- .../afm/ArithmeticMeasureDefinition.java | 100 ++++++++++++++++++ .../executeafm/afm/MeasureDefinition.java | 1 + .../ArithmeticMeasureDefinitionTest.groovy | 69 ++++++++++++ .../afm/arithmeticMeasureDefinition.json | 6 ++ 4 files changed, 176 insertions(+) create mode 100644 src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java create mode 100644 src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy create mode 100644 src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json diff --git a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java new file mode 100644 index 000000000..829e7c81f --- /dev/null +++ b/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.util.GoodDataToStringBuilder; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static com.gooddata.executeafm.afm.PreviousPeriodMeasureDefinition.NAME; + +/** + * Arithmetic measure definition representing aggregation of existing measures, for example sum of measures, difference,... + */ +@JsonRootName(NAME) +public class ArithmeticMeasureDefinition implements MeasureDefinition { + + static final String NAME = "arithmeticMeasure"; + + private final List measures; + private final String operator; + + /** + * Constructor of {@link ArithmeticMeasureDefinition} + * @param measures local identifiers of measures + * @param operator operator used for aggregation, for example sum, difference, multiplication, ratio, growth + */ + @JsonCreator + public ArithmeticMeasureDefinition( + @JsonProperty("measures") final List measures, + @JsonProperty("operator") final String operator) { + this.measures = measures; + this.operator = operator; + } + + @Deprecated + @Override + public ObjQualifier getObjQualifier() { + throw new UnsupportedOperationException("not supported operation"); + } + + /** + * no qualifiers are used, only local identifiers are used see {@link ArithmeticMeasureDefinition#getOperator()} + * @return empty set + */ + @Override + public Collection getObjQualifiers() { + return Collections.EMPTY_SET; //has no qualifiers + } + + @Deprecated + @Override + public MeasureDefinition withObjUriQualifier(UriObjQualifier qualifier) { + throw new UnsupportedOperationException("not supported operation"); + } + + /** + * no conversion is done, because this definition uses only local identifiers + * @return this instance + */ + @Override + public MeasureDefinition withObjUriQualifiers(ObjQualifierConverter objQualifierConverter) { + return this; //nothing to convert + } + + @Override + public boolean isAdHoc() { + return true; + } + + /** + * get local identifiers of used measures + * @return local identifiers of measure + */ + public List getMeasures() { + return measures; + } + + /** + * get used operator + * @return used operator + */ + public String getOperator() { + return operator; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } +} diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java index 4f2ca5a4b..b53f14315 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java @@ -24,6 +24,7 @@ @JsonSubTypes.Type(value = VOPopMeasureDefinition.class, name = VOPopMeasureDefinition.NAME), @JsonSubTypes.Type(value = OverPeriodMeasureDefinition.class, name = OverPeriodMeasureDefinition.NAME), @JsonSubTypes.Type(value = PreviousPeriodMeasureDefinition.class, name = PreviousPeriodMeasureDefinition.NAME), + @JsonSubTypes.Type(value = ArithmeticMeasureDefinition.class, name = ArithmeticMeasureDefinition.NAME) }) public interface MeasureDefinition { diff --git a/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy new file mode 100644 index 000000000..e75eacc18 --- /dev/null +++ b/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.executeafm.afm + +import com.gooddata.executeafm.UriObjQualifier +import net.javacrumbs.jsonunit.JsonMatchers +import spock.lang.Specification + +import static com.gooddata.util.ResourceUtils.readObjectFromResource +import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource +import static spock.util.matcher.HamcrestSupport.that + +class ArithmeticMeasureDefinitionTest extends Specification { + + private static final String ARITHMETIC_MEASURE_DEFINITION_JSON = 'executeafm/afm/arithmeticMeasureDefinition.json' + + def "should serialize"() { + expect: + that new ArithmeticMeasureDefinition(["localIdentifier1", "localIdentifier2"], "sum"), JsonMatchers.jsonEquals(resource(ARITHMETIC_MEASURE_DEFINITION_JSON)) + } + + def "should deserialize"() { + when: + ArithmeticMeasureDefinition measure = readObjectFromResource("/$ARITHMETIC_MEASURE_DEFINITION_JSON", ArithmeticMeasureDefinition) + + then: + measure.getOperator() == "sum" + measure.getMeasures() == ["localIdentifier1", "localIdentifier2"] + } + + def "should throw when getting used object qualifier"() { + given: + ArithmeticMeasureDefinition measure = new ArithmeticMeasureDefinition(["localIdentifier1", "localIdentifier2"], "sum") + + when: + measure.getObjQualifier() + + then: + thrown(UnsupportedOperationException) + } + + def "should return empty list when getting used object qualifiers"() { + expect: + new ArithmeticMeasureDefinition(["localIdentifier1", "localIdentifier2"], "sum").getObjQualifiers().isEmpty() + } + + def "should throw when calling withObjectUriQualifier"() { + given: + ArithmeticMeasureDefinition measure = new ArithmeticMeasureDefinition(["localIdentifier1", "localIdentifier2"], "sum") + + when: + measure.withObjUriQualifier(new UriObjQualifier("/gdc/md/a12332")) + + then: + thrown(UnsupportedOperationException) + } + + def "should return same object when calling withObjUriQualifiers"() { + setup: + ArithmeticMeasureDefinition measure = new ArithmeticMeasureDefinition(["localIdentifier1", "localIdentifier2"], "sum") + + expect: + measure.withObjUriQualifiers(Mock(ObjQualifierConverter)) == measure + + } +} diff --git a/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json b/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json new file mode 100644 index 000000000..a37305c6b --- /dev/null +++ b/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json @@ -0,0 +1,6 @@ +{ + "arithmeticMeasure" : { + "measures" : ["localIdentifier1","localIdentifier2"], + "operator" : "sum" + } +} From ec517bb1bc0cb34a9c587acdc88465978b3e999a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Ploch=C3=A1=C5=88?= Date: Tue, 17 Jul 2018 16:25:56 +0200 Subject: [PATCH 087/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15d434cff..69ee62e84 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.27.0 + 2.28.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 87ff68e0ec286c5868ebb93b7138a70273b1411b Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 17 Jul 2018 11:47:07 +0200 Subject: [PATCH 088/548] [maven-release-plugin] prepare release gooddata-java-2.28.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d763673e4..1e392013b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.27.1-SNAPSHOT + 2.28.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.28.0 From 02a727e26c7454ef73bb0db9ced42fae83c5fc00 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 17 Jul 2018 11:47:07 +0200 Subject: [PATCH 089/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1e392013b..24135f3fb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.28.0 + 2.28.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.28.0 + HEAD From 2f4ff5a34ee94a478c0e485aed1dab415a8338a0 Mon Sep 17 00:00:00 2001 From: Tantalor93 Date: Thu, 19 Jul 2018 14:08:22 +0200 Subject: [PATCH 090/548] rename measures to measureIdentifiers in ArithmeticMeasureDefinition close #629 --- .../executeafm/afm/ArithmeticMeasureDefinition.java | 12 ++++++------ .../afm/ArithmeticMeasureDefinitionTest.groovy | 2 +- .../executeafm/afm/arithmeticMeasureDefinition.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java index 829e7c81f..9974a82b5 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java @@ -26,19 +26,19 @@ public class ArithmeticMeasureDefinition implements MeasureDefinition { static final String NAME = "arithmeticMeasure"; - private final List measures; + private final List measureIdentifiers; private final String operator; /** * Constructor of {@link ArithmeticMeasureDefinition} - * @param measures local identifiers of measures + * @param measureIdentifiers local identifiers of measures * @param operator operator used for aggregation, for example sum, difference, multiplication, ratio, growth */ @JsonCreator public ArithmeticMeasureDefinition( - @JsonProperty("measures") final List measures, + @JsonProperty("measureIdentifiers") final List measureIdentifiers, @JsonProperty("operator") final String operator) { - this.measures = measures; + this.measureIdentifiers = measureIdentifiers; this.operator = operator; } @@ -81,8 +81,8 @@ public boolean isAdHoc() { * get local identifiers of used measures * @return local identifiers of measure */ - public List getMeasures() { - return measures; + public List getMeasureIdentifiers() { + return measureIdentifiers; } /** diff --git a/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy b/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy index e75eacc18..b4f7938ff 100644 --- a/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy @@ -28,7 +28,7 @@ class ArithmeticMeasureDefinitionTest extends Specification { then: measure.getOperator() == "sum" - measure.getMeasures() == ["localIdentifier1", "localIdentifier2"] + measure.getMeasureIdentifiers() == ["localIdentifier1", "localIdentifier2"] } def "should throw when getting used object qualifier"() { diff --git a/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json b/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json index a37305c6b..b34c3e713 100644 --- a/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json +++ b/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json @@ -1,6 +1,6 @@ { "arithmeticMeasure" : { - "measures" : ["localIdentifier1","localIdentifier2"], + "measureIdentifiers" : ["localIdentifier1","localIdentifier2"], "operator" : "sum" } } From 9060f5156940e24013ec3509d2053f3501cab821 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 19 Jul 2018 15:07:56 +0200 Subject: [PATCH 091/548] bump version in README before mvn release --- release.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/release.sh b/release.sh index 5c174d854..58ef61f1a 100755 --- a/release.sh +++ b/release.sh @@ -60,13 +60,16 @@ then fi fi +sed -i.bak "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md && rm -f README.md.bak +git commit -a -m "bump version" + mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" mvnRetVal=$? if [ $mvnRetVal -ne 0 ]; then echo "Mvn build failed - please fix it and try to release again" + echo "Removing last commit '$(git log -1 --pretty="%h %s")'" + git reset --hard HEAD~1 exit $mvnRetVal fi -sed -i.bak "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md && rm -f README.md.bak -git commit -a -m "bump version" git push origin --tags HEAD From 6bf860fccb327c217386e702593e8a85bd92e66a Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 19 Jul 2018 15:47:43 +0200 Subject: [PATCH 092/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69ee62e84..1d053c63e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.28.0 + 2.28.1 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 4f549b2bcd08e9409d097de643c401a781a48b9e Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 19 Jul 2018 15:49:37 +0200 Subject: [PATCH 093/548] [maven-release-plugin] prepare release gooddata-java-2.28.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 24135f3fb..97ff5d230 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.28.1-SNAPSHOT + 2.28.1 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.28.1 From ba23c60fbea0d0d93e632fee71eb87e414d8fe6f Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 19 Jul 2018 15:49:38 +0200 Subject: [PATCH 094/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 97ff5d230..6d70e0f74 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.28.1 + 2.28.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.28.1 + HEAD From 5a3ee2a50e761a9f13570ea291f7aeff9a6c5357 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 30 Jul 2018 15:36:40 +0200 Subject: [PATCH 095/548] Raise Spring version (with bugfixes) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6d70e0f74..9ea4dbfd4 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ 4.4.9 2.8.11 2.8.11.2 - 4.3.1.RELEASE + 4.3.18.RELEASE 1.1.1 1.23.0 2.20.1 From 46d864d2e4ec90f23e1ee964a0b2e7089a896122 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 30 Jul 2018 15:42:19 +0200 Subject: [PATCH 096/548] Raise HttpClient version (with bugfixes) --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9ea4dbfd4..e6135990e 100644 --- a/pom.xml +++ b/pom.xml @@ -39,8 +39,8 @@ - 4.5.5 - 4.4.9 + 4.5.6 + 4.4.10 2.8.11 2.8.11.2 4.3.18.RELEASE From c36fbb76eba92bb3038c620ba0af947b27005f91 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 3 Aug 2018 11:16:47 +0200 Subject: [PATCH 097/548] introduce totalTotals in execute AFM ExecutionResult structure --- .../executeafm/result/ExecutionResult.java | 26 +++++++++ .../result/ExecutionResultTest.groovy | 54 ++++++++++++------- .../executeafm/result/executionResult.json | 22 +++++--- .../result/executionResultFull.json | 50 ++++++++++++++--- 4 files changed, 120 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java index 3d133aba4..243884d34 100644 --- a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java +++ b/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java @@ -30,6 +30,7 @@ public class ExecutionResult { private List>> headerItems; private List>> totals; + private List>> totalTotals; private List warnings; /** @@ -64,11 +65,13 @@ public ExecutionResult(final String[][] data, final Paging paging) { @JsonProperty("paging") final Paging paging, @JsonProperty("headerItems") final List>> headerItems, @JsonProperty("totals") final List>> totals, + @JsonProperty("totalTotals") final List>> totalTotals, @JsonProperty("warnings") final List warnings) { this.data = data; this.paging = paging; this.headerItems = headerItems; this.totals = totals; + this.totalTotals = totalTotals; this.warnings = warnings; } @@ -127,6 +130,29 @@ public void setTotals(final List>> totals) { this.totals = totals; } + /** + * Gets totals of totals data. + * The totals of totals represent intersection between totals in multiple dimensions. + * For each dimension and total combination, there is a list of totals of totals values. + * + * @return 3-dimensional matrix of totals of totals data + */ + public List>> getTotalTotals() { + return totalTotals; + } + + /** + * Sets totals of totals data. + * The totals of totals represent intersection between totals in multiple dimensions. + * For each dimension and total combination, there is a list of totals of totals values. + * + * @param totalTotals 3-dimensional matrix of totals of totals data + */ + public ExecutionResult setTotalTotals(List>> totalTotals) { + this.totalTotals = totalTotals; + return this; + } + /** * @return result's warnings */ diff --git a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy index 56087edb8..801f72090 100644 --- a/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy +++ b/src/test/groovy/com/gooddata/executeafm/result/ExecutionResultTest.groovy @@ -17,12 +17,15 @@ class ExecutionResultTest extends Specification { private static final String EXECUTION_RESULT_JSON = 'executeafm/result/executionResult.json' private static final String EXECUTION_RESULT_FULL_JSON = 'executeafm/result/executionResultFull.json' - private static final String[] DATA = ["-12958511.8099999", "25315434.8199999", "-2748323.76", "-7252542.67"] + private static final String[][] DATA = [ + ["-12958511.8099999", "25315434.8199999", "-2748323.76", "-7252542.67"], + ["1234", "5853", "12340", "9999"] + ] def "should serialize"() { expect: that new ExecutionResult(DATA, - new Paging([4], [0], [4])), + new Paging([2, 4], [0, 0], [2, 4])), jsonEquals(resource(EXECUTION_RESULT_JSON)) } @@ -31,19 +34,26 @@ class ExecutionResultTest extends Specification { ExecutionResult result = readObjectFromResource("/$EXECUTION_RESULT_JSON", ExecutionResult) then: - result.paging.count == [4] - result.paging.offset == [0] - result.paging.total == [4] + result.paging.count == [2, 4] + result.paging.offset == [0, 0] + result.paging.total == [2, 4] } def "should serialize full"() { expect: - that new ExecutionResult(new DataList(DATA.collect{new DataValue(it)}), - new Paging([4], [0], [4]), - [[[ - new AttributeHeaderItem('Cost of Goods Sold', '/gdc/md/FoodMartDemo/obj/124/elements?id=3200'), - new AttributeHeaderItem('Salaries', '/gdc/md/FoodMartDemo/obj/124/elements?id=6000')]]], - [[['25']]], + that new ExecutionResult(new DataList(DATA.collect{ + def values = it.collect { new DataValue(it) } + new DataList(values) + }), + new Paging([2, 4], [0, 0], [2, 4]), + [ + [[new AttributeHeaderItem('Employee1', '/gdc/md/FoodMartDemo/obj/122/elements?id=123'), + new AttributeHeaderItem('Employee2', '/gdc/md/FoodMartDemo/obj/122/elements?id=456')]], + [[new AttributeHeaderItem('Cost of Goods Sold', '/gdc/md/FoodMartDemo/obj/124/elements?id=3200'), + new AttributeHeaderItem('Salaries', '/gdc/md/FoodMartDemo/obj/124/elements?id=6000')]] + ], + [[['25']], [['38']]], + [[['43']]], [new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null])]), jsonEquals(resource(EXECUTION_RESULT_FULL_JSON)) } @@ -53,18 +63,26 @@ class ExecutionResultTest extends Specification { ExecutionResult result = readObjectFromResource("/$EXECUTION_RESULT_FULL_JSON", ExecutionResult) then: - result.paging.count == [4] - result.paging.offset == [0] - result.paging.total == [4] + result.paging.count == [2, 4] + result.paging.offset == [0, 0] + result.paging.total == [2, 4] def accountHeaderItems = result.headerItems - accountHeaderItems[0][0][0].uri == '/gdc/md/FoodMartDemo/obj/124/elements?id=3200' - accountHeaderItems[0][0][0].name == 'Cost of Goods Sold' - accountHeaderItems[0][0][1].uri == '/gdc/md/FoodMartDemo/obj/124/elements?id=6000' - accountHeaderItems[0][0][1].name == 'Salaries' + accountHeaderItems[0][0][0].uri == '/gdc/md/FoodMartDemo/obj/122/elements?id=123' + accountHeaderItems[0][0][0].name == 'Employee1' + accountHeaderItems[0][0][1].uri == '/gdc/md/FoodMartDemo/obj/122/elements?id=456' + accountHeaderItems[0][0][1].name == 'Employee2' + accountHeaderItems[1][0][0].uri == '/gdc/md/FoodMartDemo/obj/124/elements?id=3200' + accountHeaderItems[1][0][0].name == 'Cost of Goods Sold' + accountHeaderItems[1][0][1].uri == '/gdc/md/FoodMartDemo/obj/124/elements?id=6000' + accountHeaderItems[1][0][1].name == 'Salaries' def totals = result.totals totals[0][0][0] == '25' + totals[1][0][0] == '38' + + def totalTotals = result.totalTotals + totalTotals[0][0][0] == '43' def warnings = result.warnings warnings == [new Warning('gdc123', 'Some msg %s %s %s', ['bum', 1, null])] diff --git a/src/test/resources/executeafm/result/executionResult.json b/src/test/resources/executeafm/result/executionResult.json index cc2ce1d31..4ad010553 100644 --- a/src/test/resources/executeafm/result/executionResult.json +++ b/src/test/resources/executeafm/result/executionResult.json @@ -1,20 +1,28 @@ { "executionResult": { "data": [ - "-12958511.8099999", - "25315434.8199999", - "-2748323.76", - "-7252542.67" + [ + "-12958511.8099999", + "25315434.8199999", + "-2748323.76", + "-7252542.67" + ], + [ + "1234", + "5853", + "12340", + "9999" + ] ], "paging" : { "count": [ - 4 + 2,4 ], "offset": [ - 0 + 0,0 ], "total": [ - 4 + 2,4 ] } } diff --git a/src/test/resources/executeafm/result/executionResultFull.json b/src/test/resources/executeafm/result/executionResultFull.json index 119195f8f..b6fbc4ed4 100644 --- a/src/test/resources/executeafm/result/executionResultFull.json +++ b/src/test/resources/executeafm/result/executionResultFull.json @@ -1,23 +1,47 @@ { "executionResult": { "data": [ - "-12958511.8099999", - "25315434.8199999", - "-2748323.76", - "-7252542.67" + [ + "-12958511.8099999", + "25315434.8199999", + "-2748323.76", + "-7252542.67" + ], + [ + "1234", + "5853", + "12340", + "9999" + ] ], "paging" : { "count": [ - 4 + 2,4 ], "offset": [ - 0 + 0,0 ], "total": [ - 4 + 2,4 ] }, "headerItems": [ + [ + [ + { + "attributeHeaderItem": { + "uri": "/gdc/md/FoodMartDemo/obj/122/elements?id=123", + "name": "Employee1" + } + }, + { + "attributeHeaderItem": { + "uri": "/gdc/md/FoodMartDemo/obj/122/elements?id=456", + "name": "Employee2" + } + } + ] + ], [ [ { @@ -40,6 +64,18 @@ [ "25" ] + ], + [ + [ + "38" + ] + ] + ], + "totalTotals": [ + [ + [ + "43" + ] ] ], "warnings": [ From a12d0cdbc93f2f05b4d32e2bab4d8b3f384cf3d8 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 3 Aug 2018 14:30:32 +0200 Subject: [PATCH 098/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d053c63e..949cc95bb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.28.1 + 2.29.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 75fe971d26e4061e70e74db4eeae2bb2315507b9 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 3 Aug 2018 14:32:00 +0200 Subject: [PATCH 099/548] [maven-release-plugin] prepare release gooddata-java-2.29.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e6135990e..2e432a580 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.28.2-SNAPSHOT + 2.29.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.29.0 From dff627fee5d8e8c0ea198779c2ae5c6324255e28 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 3 Aug 2018 14:32:00 +0200 Subject: [PATCH 100/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2e432a580..b9f14af5b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.29.0 + 2.29.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.29.0 + HEAD From b987605786e3665af7d049054af04f8167a4481b Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 10 Aug 2018 14:36:32 +0200 Subject: [PATCH 101/548] Differentiate AttributeContent from Content Mainly same field name 'content' as in DisplayForm parent was causing chaos. --- .../com/gooddata/md/AttributeDisplayForm.java | 34 +++++++++---------- .../gooddata/md/AttributeDisplayFormTest.java | 34 ++++++++++++++----- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index ae15f12c9..a199c5c7e 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -5,16 +5,11 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.util.BooleanDeserializer; -import com.gooddata.util.BooleanIntegerSerializer; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.BooleanDeserializer; +import com.gooddata.util.BooleanIntegerSerializer; import com.gooddata.util.GoodDataToStringBuilder; /** @@ -27,24 +22,29 @@ public class AttributeDisplayForm extends DisplayForm implements Updatable { private static final long serialVersionUID = -7903851496647992573L; + /** @deprecated use {@link #attributeContent} instead */ + @Deprecated + protected final AttributeContent content; + @JsonProperty("content") - protected final Content content; + protected final AttributeContent attributeContent; @JsonCreator - private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content, + private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") AttributeContent content, @JsonProperty("links") Links links) { super(meta, content, links); this.content = content; + this.attributeContent = content; } /* Just for serialization test */ AttributeDisplayForm(String title, String formOf, String expression, boolean isDefault, String ldmExpression, String type, String elements) { - this(new Meta(title), new Content(formOf, expression, isDefault, ldmExpression, type), new Links(elements)); + this(new Meta(title), new AttributeContent(formOf, expression, isDefault, ldmExpression, type), new Links(elements)); } @JsonIgnore public boolean isDefault() { - return Boolean.TRUE.equals(content.isDefault()); + return Boolean.TRUE.equals(attributeContent.isDefault()); } @Override @@ -53,15 +53,15 @@ public String toString() { } @JsonInclude(JsonInclude.Include.NON_NULL) - private static class Content extends DisplayForm.Content { + private static class AttributeContent extends DisplayForm.Content { private static final long serialVersionUID = -8502672468934478137L; private final boolean isDefault; - private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") @JsonDeserialize(using = BooleanDeserializer.class) Boolean isDefault, - @JsonProperty("ldmexpression") String ldmExpression, - @JsonProperty("type") String type) { + private AttributeContent(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, + @JsonProperty("default") @JsonDeserialize(using = BooleanDeserializer.class) Boolean isDefault, + @JsonProperty("ldmexpression") String ldmExpression, + @JsonProperty("type") String type) { super(formOf, expression, ldmExpression, type); this.isDefault = isDefault; } diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index fe241e760..eeb9611e9 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -18,13 +18,14 @@ public class AttributeDisplayFormTest { - public static final String FORM_OF = "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID"; - public static final String EXPRESSION = "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]"; - public static final boolean DEFAULT = false; - public static final boolean DEFAULT_TRUE = true; - public static final String LDM_EXPRESSION = ""; + private static final String FORM_OF = "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID"; + private static final String EXPRESSION = "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]"; + private static final boolean DEFAULT = false; + private static final boolean DEFAULT_TRUE = true; + private static final String LDM_EXPRESSION = ""; private static final String TYPE = "TYPE"; private static final String ELEMENTS_LINK = "/gdc/md/PROJECT_ID/obj/DF_ID/elements"; + private static final String TITLE = "Person Name"; @SuppressWarnings("deprecation") @Test @@ -43,21 +44,21 @@ public void shouldDeserialize() throws Exception { @Test public void testSerialization() throws Exception { - final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, + final DisplayForm attrDF = new AttributeDisplayForm(TITLE, FORM_OF, EXPRESSION, DEFAULT, LDM_EXPRESSION, TYPE, ELEMENTS_LINK); assertThat(attrDF, jsonEquals(resource("md/attributeDisplayForm-input.json"))); } @Test - public void shouldSerializeSameAsDeserializationInput() throws Exception { + public void shouldSerializeSameAsDeserializationInput() { final AttributeDisplayForm attrDF = readObjectFromResource("/md/attributeDisplayForm.json", AttributeDisplayForm.class); assertThat(attrDF, jsonEquals(resource("md/attributeDisplayForm-inputOrig.json"))); } @Test public void testToStringFormat() { - final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, + final DisplayForm attrDF = new AttributeDisplayForm(TITLE, FORM_OF, EXPRESSION, DEFAULT, LDM_EXPRESSION, TYPE, ELEMENTS_LINK); assertThat(attrDF.toString(), matchesPattern(AttributeDisplayForm.class.getSimpleName() + "\\[.*\\]")); @@ -65,11 +66,26 @@ public void testToStringFormat() { @Test public void testSerializable() throws Exception { - final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, + final DisplayForm attrDF = new AttributeDisplayForm(TITLE, FORM_OF, EXPRESSION, DEFAULT, LDM_EXPRESSION, TYPE, ELEMENTS_LINK); final DisplayForm deserialized = SerializationUtils.roundtrip(attrDF); assertThat(deserialized, jsonEquals(attrDF)); } + @Test + public void testSubclass() { + class Subclass extends AttributeDisplayForm { + private Subclass(final String title, final String formOf, final String expression, final boolean isDefault, + final String ldmExpression, + final String type, final String elements) { + super(title, formOf, expression, isDefault, ldmExpression, type, elements); + } + } + final Subclass subclass = new Subclass(TITLE, FORM_OF, EXPRESSION, DEFAULT, LDM_EXPRESSION, TYPE, + ELEMENTS_LINK); + + //noinspection deprecation + assertThat(subclass.content, is(subclass.attributeContent)); + } } From 4d69de05636d29d18cc37a636d2e031a95ad8967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Thu, 11 Oct 2018 09:02:45 +0200 Subject: [PATCH 102/548] Remove acceptance test for Datawarehouse S3 creds --- .../warehouse/WarehouseServiceAT.java | 57 ------------------- 1 file changed, 57 deletions(-) diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index b436ba3f7..d6fcfd951 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -11,8 +11,6 @@ import com.gooddata.collections.PageRequest; import com.gooddata.collections.PageableList; import com.gooddata.project.Environment; -import org.apache.commons.lang3.RandomStringUtils; -import org.joda.time.DateTime; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -28,7 +26,6 @@ import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; @@ -41,8 +38,6 @@ public class WarehouseServiceAT extends AbstractGoodDataAT { private static final String LOGIN = "john.smith." + UUID.randomUUID() + "@gooddata.com"; private static final String SCHEMA_NAME = "default"; - private static final String S3_CREDENTIALS_REGION = "us-east-1"; - private static final String S3_CREDENTIALS_ACCESS_KEY = "WarehouseServiceAt" + RandomStringUtils.randomAlphanumeric(5); private final String warehouseToken; private final WarehouseService service; @@ -52,7 +47,6 @@ public class WarehouseServiceAT extends AbstractGoodDataAT { private Account account; private WarehouseUser warehouseUser; - private WarehouseS3Credentials s3Credentials; public WarehouseServiceAT() { warehouseToken = getProperty("warehouseToken"); @@ -64,15 +58,6 @@ public void initIsolatedDomainGroup() { account = gd.getAccountService().createAccount(new Account(LOGIN, "nnPvcGXU7f", "FirstName", "LastName"), getProperty("domain")); } - @Test(groups = "warehouse", dependsOnGroups = "account") - public void createWarehouse() throws Exception { - final Warehouse wh = new Warehouse(title, warehouseToken); - wh.setEnvironment(Environment.TESTING); - warehouse = service.createWarehouse(wh).get(60, TimeUnit.MINUTES); - s3Credentials = new WarehouseS3Credentials(S3_CREDENTIALS_REGION, S3_CREDENTIALS_ACCESS_KEY, "secret"); - String jdbc = warehouse.getConnectionUrl(); - } - @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") public void getWarehouse() throws Exception { final Warehouse warehouse = service.getWarehouseById(this.warehouse.getId()); @@ -156,48 +141,6 @@ public void getDefaultWarehouseSchema() { assertThat(warehouseSchema, is(notNullValue())); } - @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") - public void addS3Credentials() { - s3Credentials = service.addS3Credentials(warehouse, s3Credentials) - .get(1, TimeUnit.MINUTES); - - assertThat(s3Credentials, notNullValue()); - } - - @Test(groups = "warehouse", dependsOnMethods = "addS3Credentials") - public void updateS3Credentials() { - final DateTime lastUpdated = s3Credentials.getUpdated(); - s3Credentials.setSecretKey("newSecretKey"); - s3Credentials = service.updateS3Credentials(s3Credentials) - .get(1, TimeUnit.MINUTES); - - assertThat(s3Credentials, notNullValue()); - assertThat(s3Credentials.getUpdated(), is(not(lastUpdated))); - } - - @Test(groups = "warehouse", dependsOnMethods = "updateS3Credentials") - public void getS3SpecificCredentials() { - final WarehouseS3Credentials result = service.getWarehouseS3Credentials(warehouse, S3_CREDENTIALS_REGION, - S3_CREDENTIALS_ACCESS_KEY); - - assertThat(result, notNullValue()); - assertThat(result.getAccessKey(), is(S3_CREDENTIALS_ACCESS_KEY)); - } - - @Test(groups = "warehouse", dependsOnMethods = "updateS3Credentials") - public void listS3Credentials() { - final PageableList result = service.listWarehouseS3Credentials(warehouse); - - assertThat(result, notNullValue()); - assertThat(result.size(), is(1)); - assertThat(result.getNextPage(), nullValue()); - } - - @Test(groups = "warehouse", dependsOnMethods = { "listS3Credentials", "getS3SpecificCredentials" }) - public void removeS3Credentials() { - service.removeS3Credentials(s3Credentials).get(1, TimeUnit.MINUTES); - } - @Test(dependsOnGroups = "warehouse") public void removeWarehouse() throws Exception { service.removeWarehouse(warehouse); From 8983c20391943c17651554bb2ad2dab310df2973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Thu, 11 Oct 2018 09:02:45 +0200 Subject: [PATCH 103/548] Remove support for Datawarehouse S3 credentials --- .../warehouse/WarehouseS3Credentials.java | 196 ---------- .../WarehouseS3CredentialsException.java | 29 -- .../warehouse/WarehouseS3CredentialsList.java | 41 --- ...arehouseS3CredentialsListDeserializer.java | 24 -- .../WarehouseS3CredentialsListSerializer.java | 15 - ...rehouseS3CredentialsNotFoundException.java | 17 - .../gooddata/warehouse/WarehouseService.java | 188 ---------- .../com/gooddata/warehouse/WarehouseTask.java | 4 - .../WarehouseS3CredentialsExceptionTest.java | 20 - .../WarehouseS3CredentialsListTest.java | 58 --- .../warehouse/WarehouseS3CredentialsTest.java | 132 ------- .../warehouse/WarehouseServiceAT.java | 57 --- .../warehouse/WarehouseServiceIT.java | 347 ------------------ .../warehouse/WarehouseServiceTest.java | 47 --- .../gooddata/warehouse/WarehouseTaskTest.java | 1 - .../warehouse/s3Credentials-create.json | 7 - .../warehouse/s3Credentials-get.json | 13 - .../warehouse/s3Credentials-update.json | 7 - .../warehouse/s3CredentialsList.json | 32 -- .../warehouse/warehouseTask-finished.json | 3 +- 20 files changed, 1 insertion(+), 1237 deletions(-) delete mode 100644 src/main/java/com/gooddata/warehouse/WarehouseS3Credentials.java delete mode 100644 src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsException.java delete mode 100644 src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsList.java delete mode 100644 src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListDeserializer.java delete mode 100644 src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListSerializer.java delete mode 100644 src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsNotFoundException.java delete mode 100644 src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsExceptionTest.java delete mode 100644 src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsListTest.java delete mode 100644 src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsTest.java delete mode 100644 src/test/java/com/gooddata/warehouse/WarehouseServiceTest.java delete mode 100644 src/test/resources/warehouse/s3Credentials-create.json delete mode 100644 src/test/resources/warehouse/s3Credentials-get.json delete mode 100644 src/test/resources/warehouse/s3Credentials-update.json delete mode 100644 src/test/resources/warehouse/s3CredentialsList.json diff --git a/src/main/java/com/gooddata/warehouse/WarehouseS3Credentials.java b/src/main/java/com/gooddata/warehouse/WarehouseS3Credentials.java deleted file mode 100644 index bede8aa5e..000000000 --- a/src/main/java/com/gooddata/warehouse/WarehouseS3Credentials.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.gooddata.util.GoodDataToStringBuilder; -import com.gooddata.util.ISODateTimeDeserializer; -import com.gooddata.util.ISODateTimeSerializer; -import org.joda.time.DateTime; -import org.springframework.web.util.UriTemplate; - -import static com.gooddata.util.Validate.notNullState; - -/** - * Single warehouse S3 credentials record (identified uniquely by warehouse ID, region and access key) - */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("s3Credentials") -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class WarehouseS3Credentials { - public static final String URI = WarehouseS3CredentialsList.URI + "/{region}/{accessKey}"; - public static final UriTemplate TEMPLATE = new UriTemplate(URI); - - @JsonView(UpdateView.class) - private final String region; - - @JsonView(UpdateView.class) - private final String accessKey; - - private final DateTime updated; - - @JsonView(UpdateView.class) - private String secretKey; - - private final Links links; - - /** - * Used to add new S3 credentials - * - * @param region S3 region - * @param accessKey S3 access key - * @param secretKey S3 secret key - */ - public WarehouseS3Credentials(final String region, - final String accessKey, - final String secretKey) { - this(region, accessKey, secretKey, null, null); - } - - @JsonCreator - protected WarehouseS3Credentials(@JsonProperty("region") final String region, - @JsonProperty("accessKey") final String accessKey, - @JsonProperty("secretKey") final String secretKey, - @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) - final DateTime updated, - @JsonProperty("links") final Links links) { - this.region = region; - this.accessKey = accessKey; - this.secretKey = secretKey; - this.updated = updated; - this.links = links; - } - - /** - * @return the date and time of last modification - */ - @JsonSerialize(using = ISODateTimeSerializer.class) - public DateTime getUpdated() { - return updated; - } - - /** - * not returned when listing - * @return S3 secret key - */ - public String getSecretKey() { - return secretKey; - } - - /** - * Sets new secret key - * - * @param secretKey secret key to set - */ - public void setSecretKey(final String secretKey) { - this.secretKey = secretKey; - } - - public String getAccessKey() { - return accessKey; - } - - public String getRegion() { - return region; - } - - public Links getLinks() { - return links; - } - - /** - * @return URI of this resource - */ - @JsonIgnore - public String getUri() { - return notNullState(links, "links").getSelf(); - } - - /** - * @return URI of the parent of warehouse S3 credentials - */ - @JsonIgnore - public String getListUri() { - return notNullState(links, "links").getParent(); - } - - /** - * @return URI of the warehouse - */ - @JsonIgnore - public String getInstanceUri() { - return notNullState(links, "links").getInstance(); - } - - /** - * @return URI of the user profile, who was the last to modify this resource - */ - @JsonIgnore - public String getUpdatedByUri() { - return notNullState(links, "links").getUpdatedBy(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class Links { - private final String self; - private final String parent; - private final String instance; - private final String updatedBy; - - @JsonCreator - public Links(@JsonProperty("self") String self, - @JsonProperty("parent") String parent, - @JsonProperty("instance") String instance, - @JsonProperty("updatedBy") String updatedBy) { - this.self = self; - this.parent = parent; - this.instance = instance; - this.updatedBy = updatedBy; - } - - public String getSelf() { - return self; - } - - public String getParent() { - return parent; - } - - public String getInstance() { - return instance; - } - - public String getUpdatedBy() { - return updatedBy; - } - - @Override - public String toString() { - return GoodDataToStringBuilder.defaultToString(this); - } - } - - @Override - public String toString() { - return GoodDataToStringBuilder.defaultToString(this, "secretKey"); - } - - /** - * Class representing update view of warehouse S3 credentials - */ - static class UpdateView { - } -} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsException.java b/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsException.java deleted file mode 100644 index 2f51996f7..000000000 --- a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.gooddata.GoodDataException; - -/** - * Thrown when REST operation failed for S3 credentials - */ -public class WarehouseS3CredentialsException extends GoodDataException { - - private final String uri; - - public WarehouseS3CredentialsException(String uri, String message, Exception cause) { - super(message, cause); - this.uri = uri; - } - - public WarehouseS3CredentialsException(final String uri, final String message) { - this(uri, message, null); - } - - public String getUri() { - return uri; - } -} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsList.java b/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsList.java deleted file mode 100644 index b3cd06e62..000000000 --- a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsList.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.gooddata.collections.PageableList; -import org.springframework.web.util.UriTemplate; - -import java.util.List; -import java.util.Map; - -/** - * List of warehouse S3 credentials for a given warehouse - */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("s3CredentialsList") -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonDeserialize(using = WarehouseS3CredentialsListDeserializer.class) -@JsonSerialize(using = WarehouseS3CredentialsListSerializer.class) -public class WarehouseS3CredentialsList extends PageableList { - - static final String ROOT_NODE = "s3CredentialsList"; - public static final String URI = Warehouse.URI + "/s3"; - public static final UriTemplate TEMPLATE = new UriTemplate(URI); - - public WarehouseS3CredentialsList(final List items) { - this(items, null); - } - - public WarehouseS3CredentialsList(final List items, - final Map links) { - super(items, null, links); - } -} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListDeserializer.java b/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListDeserializer.java deleted file mode 100644 index 4c9f2db34..000000000 --- a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListDeserializer.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.gooddata.collections.PageableListDeserializer; -import com.gooddata.collections.Paging; - -import java.util.List; -import java.util.Map; - -class WarehouseS3CredentialsListDeserializer extends PageableListDeserializer { - - WarehouseS3CredentialsListDeserializer() { - super(WarehouseS3Credentials.class); - } - - @Override - protected WarehouseS3CredentialsList createList(List items, Paging paging, Map links) { - return new WarehouseS3CredentialsList(items, links); - } -} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListSerializer.java b/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListSerializer.java deleted file mode 100644 index cdfa51d20..000000000 --- a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsListSerializer.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.gooddata.collections.PageableListSerializer; - -class WarehouseS3CredentialsListSerializer extends PageableListSerializer { - - WarehouseS3CredentialsListSerializer() { - super(WarehouseS3CredentialsList.ROOT_NODE); - } -} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsNotFoundException.java deleted file mode 100644 index 832b5dfd5..000000000 --- a/src/main/java/com/gooddata/warehouse/WarehouseS3CredentialsNotFoundException.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.gooddata.GoodDataRestException; - -/** - * Thrown when specific S3 credentials, identified by warehouse ID, region and access key cannot be found - */ -public class WarehouseS3CredentialsNotFoundException extends WarehouseS3CredentialsException { - public WarehouseS3CredentialsNotFoundException(String uri, GoodDataRestException cause) { - super(uri, "Warehouse S3 credentials " + uri + " not found", cause); - } -} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 92378f8d6..30098059b 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -16,23 +16,18 @@ import com.gooddata.collections.Page; import com.gooddata.collections.PageRequest; import com.gooddata.collections.PageableList; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.http.converter.json.MappingJacksonValue; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import org.springframework.web.util.UriTemplate; import java.io.IOException; import java.net.URI; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; -import static java.lang.String.format; /** * Provide access to warehouse API - create, update, list and delete warehouses. @@ -464,187 +459,4 @@ public WarehouseSchema getDefaultWarehouseSchema(final Warehouse warehouse) { return getWarehouseSchemaByName(warehouse, DEFAULT_SCHEMA_NAME); } - /** - * List S3 credentials for the Warehouse. Returns empty list if no credentials are found. - * - * @param warehouse warehouse to get S3 credentials for - * @return PageableList with all S3 credentials belonging to the Warehouse (not null) - * @throws WarehouseS3CredentialsException in case of failure during the REST operation - */ - public PageableList listWarehouseS3Credentials(final Warehouse warehouse) { - notNull(warehouse, "warehouse"); - - final String uri = getWarehouseS3CredentialsListUri(warehouse).toString(); - try { - final WarehouseS3CredentialsList result = restTemplate.getForObject(uri, WarehouseS3CredentialsList.class); - if (result == null) { - return new PageableList<>(); - } - return result; - } catch (GoodDataException | RestClientException e) { - throw new WarehouseS3CredentialsException(uri, "Unable to list Warehouse S3 credentials at " + uri, e); - } - } - - /** - * Get S3 credentials for the Warehouse based on {@code region} and {@code accessKey}. - * - * @param warehouse warehouse to get S3 credentials for - * @return single S3 credentials record (not null) - * @throws WarehouseS3CredentialsNotFoundException if no S3 credentials for the given parameters were found - * @throws WarehouseS3CredentialsException in case of failure during the REST operation - */ - public WarehouseS3Credentials getWarehouseS3Credentials(final Warehouse warehouse, - final String region, - final String accessKey) { - notNull(warehouse, "warehouse"); - notEmpty(region, "region"); - notEmpty(accessKey, "accessKey"); - - final String uri = getWarehouseS3CredentialsUri(warehouse, region, accessKey).toString(); - - try { - return restTemplate.getForObject(uri, WarehouseS3Credentials.class); - } catch (GoodDataRestException e) { - if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { - throw new WarehouseS3CredentialsNotFoundException(uri, e); - } else { - throw e; - } - } catch (RestClientException e) { - throw new WarehouseS3CredentialsException(uri, "Unable to get Warehouse S3 credentials " + uri, e); - } - } - - /** - * add new S3 credentials to the Warehouse - * - * @param warehouse warehouse the S3 credentials should be added to - * @param s3Credentials the credentials to store - * @return added credentials (not null) - * @throws WarehouseS3CredentialsException in case of failure during the REST operation - */ - public FutureResult addS3Credentials(final Warehouse warehouse, - final WarehouseS3Credentials s3Credentials) { - notNull(warehouse, "warehouse"); - notEmpty(warehouse.getId(), "warehouse.id"); - notNull(s3Credentials, "s3Credentials"); - - final WarehouseTask task = createWarehouseTask(WarehouseS3CredentialsList.URI, HttpMethod.POST, - s3Credentials, createUpdateHttpEntity(s3Credentials), warehouse.getId()); - final String newCredentialsUri = WarehouseS3Credentials.TEMPLATE.expand(warehouse.getId(), - s3Credentials.getRegion(), s3Credentials.getAccessKey()).toString(); - return new PollResult<>(this, createS3PollHandler(newCredentialsUri, task, "add")); - } - - /** - * update S3 credentials in the Warehouse - * - * @param s3Credentials the credentials to update - * @return updated credentials (not null) - * @throws WarehouseS3CredentialsException in case of failure during the REST operation - */ - public FutureResult updateS3Credentials(final WarehouseS3Credentials s3Credentials) { - notNull(s3Credentials, "s3Credentials"); - notNull(s3Credentials.getUri(), "s3Credentials.links.self"); - - final WarehouseTask task = createWarehouseTask(s3Credentials.getUri(), HttpMethod.PUT, - s3Credentials, createUpdateHttpEntity(s3Credentials)); - return new PollResult<>(this, createS3PollHandler(s3Credentials.getUri(), task, "update")); - } - - /** - * delete S3 credentials in the Warehouse - * - * @param s3Credentials the credentials to delete - * @return nothing (Void) - * @throws WarehouseS3CredentialsException in case of failure during the REST operation - */ - public FutureResult removeS3Credentials(final WarehouseS3Credentials s3Credentials) { - notNull(s3Credentials, "s3Credentials"); - notNull(s3Credentials.getUri(), "s3Credentials.links.self"); - - final HttpEntity emptyRequestEntity = new HttpEntity<>(new HttpHeaders()); - final WarehouseTask task = createWarehouseTask(s3Credentials.getUri(), HttpMethod.DELETE, - s3Credentials, emptyRequestEntity); - return new PollResult<>(this, createS3PollHandler(s3Credentials.getUri(), task, Void.class, "delete")); - } - - private WarehouseTask createWarehouseTask(final String targetUri, - final HttpMethod httpMethod, - final WarehouseS3Credentials s3Credentials, - final HttpEntity requestEntity, - final Object... args) { - try { - final HttpEntity taskHttpEntity = restTemplate.exchange(targetUri, httpMethod, - requestEntity, WarehouseTask.class, args); - - if (taskHttpEntity == null || taskHttpEntity.getBody() == null) { - throw new WarehouseS3CredentialsException(targetUri, - format("Empty response when trying to %s S3 credentials via API", httpMethod.name())); - } - return taskHttpEntity.getBody(); - } catch (GoodDataException | RestClientException e) { - final String expandedTargetUri = new UriTemplate(targetUri).expand(args).toString(); - throw new WarehouseS3CredentialsException(targetUri, format("Unable to %s S3 credentials %s with region: %s, access key: %s", - httpMethod.name(), expandedTargetUri, s3Credentials.getRegion(), s3Credentials.getAccessKey()), e); - } - } - - private HttpEntity createUpdateHttpEntity(final WarehouseS3Credentials s3Credentials) { - final MappingJacksonValue jacksonValue = new MappingJacksonValue(s3Credentials); - jacksonValue.setSerializationView(WarehouseS3Credentials.UpdateView.class); - return new HttpEntity<>(jacksonValue); - } - - private AbstractPollHandler createS3PollHandler(final String credentialsUri, - final WarehouseTask task, - final String action) { - return createS3PollHandler(credentialsUri, task, WarehouseS3Credentials.class, action); - } - - private AbstractPollHandler createS3PollHandler(final String credentialsUri, - final WarehouseTask task, - final Class resultClass, - final String action) { - return new AbstractPollHandler(task.getPollUri(), WarehouseTask.class, resultClass) { - - @Override - public boolean isFinished(ClientHttpResponse response) throws IOException { - final HttpStatus expectedStatus = "add".equals(action) ? HttpStatus.CREATED : HttpStatus.OK; - return response.getStatusCode() == expectedStatus; - } - - @Override - public void handlePollResult(WarehouseTask pollResult) { - final String uri = pollResult.getWarehouseS3CredentialsUri(); - try { - final R result = restTemplate.getForObject(uri, resultClass); - setResult(result); - } catch (GoodDataException | RestClientException e) { - throw new WarehouseS3CredentialsException(uri, - format("Attempt to %s S3 credentials in warehouse failed, can't get the result, uri: %s", - action, uri), e); - } - } - - @Override - public void handlePollException(final GoodDataRestException e) { - throw new WarehouseS3CredentialsException(credentialsUri, - format("Unable to %s S3 credentials in warehouse, uri: %s", action, credentialsUri), e); - } - }; - } - - private URI getWarehouseS3CredentialsListUri(final Warehouse warehouse) { - notEmpty(warehouse.getId(), "warehouse.id"); - - return WarehouseS3CredentialsList.TEMPLATE.expand(warehouse.getId()); - } - - private URI getWarehouseS3CredentialsUri(final Warehouse warehouse, final String region, final String accessKey) { - notEmpty(warehouse.getId(), "warehouse.id"); - - return WarehouseS3Credentials.TEMPLATE.expand(warehouse.getId(), region, accessKey); - } } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index d99eadf68..69732b839 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -24,7 +24,6 @@ class WarehouseTask { private static final String POLL_LINK = "poll"; private static final String WAREHOUSE_LINK = "instance"; private static final String WAREHOUSE_USER_LINK = "user"; - private static final String WAREHOUSE_S3_CREDENTIALS_LINK = "s3Credentials"; private final Map links; @@ -60,7 +59,4 @@ String getWarehouseUserUri() { return links.get(WAREHOUSE_USER_LINK); } - String getWarehouseS3CredentialsUri() { - return links.get(WAREHOUSE_S3_CREDENTIALS_LINK); - } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsExceptionTest.java b/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsExceptionTest.java deleted file mode 100644 index ad12416f0..000000000 --- a/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsExceptionTest.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import org.testng.annotations.Test; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public class WarehouseS3CredentialsExceptionTest { - - public static final String URI = "/some/uri"; - - @Test - public void getUri() { - assertThat(new WarehouseS3CredentialsException(URI, "message").getUri(), is(URI)); - } -} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsListTest.java b/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsListTest.java deleted file mode 100644 index fbce5d81b..000000000 --- a/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsListTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import org.joda.time.DateTime; -import org.testng.annotations.Test; - -import java.util.HashMap; -import java.util.Map; - -import static com.gooddata.util.ResourceUtils.readObjectFromResource; -import static java.util.Arrays.asList; -import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; -import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -public class WarehouseS3CredentialsListTest { - - private static final String SELF_LINK = "/gdc/datawarehouse/instances/{instance-id}/s3/region/accessKey"; - private static final String PARENT_LINK = "/gdc/datawarehouse/instances/{instance-id}/s3"; - private static final String INSTANCE_LINK = "/gdc/datawarehouse/instances/{instance-id}"; - private static final String UPDATED_BY_LINK = "/gdc/datawarehouse/instances/{instance-id}/users/{user-id}"; - - private final WarehouseS3Credentials.Links credentials1Links = new WarehouseS3Credentials.Links( - SELF_LINK, PARENT_LINK, INSTANCE_LINK, UPDATED_BY_LINK - ); - private final WarehouseS3Credentials credentials1 = new WarehouseS3Credentials("region", "accessKey", - "secretKey", - DateTime.parse("2017-08-02T09:40:24.064Z"), credentials1Links); - private final WarehouseS3Credentials credentials2 = new WarehouseS3Credentials( "region2", "accessKey2", - "secretKey2", null, null); - - private final Map links = new HashMap() {{ - put("self", "/gdc/datawarehouse/instances/{instance-id}/s3"); - put("parent", "/gdc/datawarehouse/instances/{instance-id}"); - }}; - - private final WarehouseS3CredentialsList credentialsList = new WarehouseS3CredentialsList( - asList(credentials1, credentials2), links); - - @Test - public void serialize() { - assertThat(credentialsList, jsonEquals(resource("warehouse/s3CredentialsList.json"))); - } - - @Test - public void deserialize() { - final WarehouseS3CredentialsList result = readObjectFromResource("/warehouse/s3CredentialsList.json", - WarehouseS3CredentialsList.class); - - assertThat(result.size(), is(2)); - assertThat(result.getLinks(), is(links)); - } -} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsTest.java b/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsTest.java deleted file mode 100644 index 05326ef40..000000000 --- a/src/test/java/com/gooddata/warehouse/WarehouseS3CredentialsTest.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.testng.annotations.Test; - -import static com.gooddata.util.ResourceUtils.readObjectFromResource; -import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs; -import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; -import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource; -import static org.hamcrest.CoreMatchers.endsWith; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -public class WarehouseS3CredentialsTest { - - private static final String REGION = "region"; - private static final String ACCESS_KEY = "accessKey"; - private static final String UPDATED_BY = "/gdc/datawarehouse/instances/instanceId/users/{user-id}"; - private static final String SECRET_KEY = "secretKey"; - private static final String NEW_SECRET_KEY = "newSecretKey"; - private static final DateTime UPDATED_AT = DateTime.parse("2017-08-02T09:40:24.064Z"); - private static final String SELF_LINK = "/gdc/datawarehouse/instances/instanceId/s3/region/accessKey"; - private static final String PARENT_LINK = "/gdc/datawarehouse/instances/instanceId/s3"; - private static final String INSTANCE_LINK = "/gdc/datawarehouse/instances/instanceId"; - private static final WarehouseS3Credentials.Links LINKS = new WarehouseS3Credentials.Links( - SELF_LINK, PARENT_LINK, INSTANCE_LINK, UPDATED_BY - ); - - @Test - public void serializeGet() { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, null, - UPDATED_AT, LINKS); - assertThat(credentials, jsonEquals(resource("warehouse/s3Credentials-get.json"))); - } - - @Test - public void serializeUsingUpdateView() throws JsonProcessingException { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, NEW_SECRET_KEY, - UPDATED_AT, LINKS); - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); - - final String json = objectMapper - .writerWithView(WarehouseS3Credentials.UpdateView.class) - .writeValueAsString(credentials); - assertThat(json, jsonEquals(resource("warehouse/s3Credentials-update.json"))); - } - - @Test - public void serializeCreate() { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, SECRET_KEY); - assertThat(credentials, jsonEquals(resource("warehouse/s3Credentials-create.json"))); - } - - @Test - public void deserializeGet() { - final WarehouseS3Credentials credentials = readObjectFromResource("/warehouse/s3Credentials-get.json", - WarehouseS3Credentials.class); - - assertThat(credentials.getRegion(), is(REGION)); - assertThat(credentials.getAccessKey(), is(ACCESS_KEY)); - assertThat(credentials.getSecretKey(), is(nullValue())); - assertThat(credentials.getUpdated().toString(), is(UPDATED_AT.toString())); - assertThat(credentials.getLinks(), is(sameBeanAs(LINKS))); - assertThat(credentials.getLinks().toString(), is(notNullValue())); - } - - @Test - public void deserializeCreate() { - final WarehouseS3Credentials credentials = readObjectFromResource("/warehouse/s3Credentials-create.json", - WarehouseS3Credentials.class); - - assertThat(credentials.getRegion(), is(REGION)); - assertThat(credentials.getAccessKey(), is(ACCESS_KEY)); - assertThat(credentials.getSecretKey(), is(SECRET_KEY)); - assertThat(credentials.getUpdated(), is(nullValue())); - assertThat(credentials.getLinks(), is(nullValue())); - } - - @Test - public void withSecretKey() { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, null, - UPDATED_AT, null); - assertThat(credentials.getSecretKey(), is(nullValue())); - - credentials.setSecretKey(SECRET_KEY); - assertThat(credentials.getSecretKey(), is(SECRET_KEY)); - } - - @Test - public void withLinks() { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, - SECRET_KEY, UPDATED_AT, LINKS); - assertThat(credentials.getLinks(), is(LINKS)); - } - - @Test - public void withLinksForWarehouse() { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, - "updaterId", UPDATED_AT, LINKS); - assertThat(credentials.getInstanceUri(), endsWith("/instanceId")); - assertThat(credentials.getListUri(), endsWith("/instanceId/s3")); - assertThat(credentials.getUri(), endsWith("/instanceId/s3/region/accessKey")); - assertThat(credentials.getUpdatedByUri(), endsWith("/users/{user-id}")); - } - - @Test - public void getUri() { - final WarehouseS3Credentials credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, - UPDATED_BY, UPDATED_AT, LINKS); - - assertThat(credentials.getUri(), is("/gdc/datawarehouse/instances/instanceId/s3/region/accessKey")); - } - - @Test - public void testToString() { - final WarehouseS3Credentials credentials = readObjectFromResource("/warehouse/s3Credentials-create.json", - WarehouseS3Credentials.class); - - assertThat(credentials.toString(), is("WarehouseS3Credentials[region=region,accessKey=accessKey,updated=]")); - } -} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index b436ba3f7..d6fcfd951 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -11,8 +11,6 @@ import com.gooddata.collections.PageRequest; import com.gooddata.collections.PageableList; import com.gooddata.project.Environment; -import org.apache.commons.lang3.RandomStringUtils; -import org.joda.time.DateTime; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -28,7 +26,6 @@ import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; @@ -41,8 +38,6 @@ public class WarehouseServiceAT extends AbstractGoodDataAT { private static final String LOGIN = "john.smith." + UUID.randomUUID() + "@gooddata.com"; private static final String SCHEMA_NAME = "default"; - private static final String S3_CREDENTIALS_REGION = "us-east-1"; - private static final String S3_CREDENTIALS_ACCESS_KEY = "WarehouseServiceAt" + RandomStringUtils.randomAlphanumeric(5); private final String warehouseToken; private final WarehouseService service; @@ -52,7 +47,6 @@ public class WarehouseServiceAT extends AbstractGoodDataAT { private Account account; private WarehouseUser warehouseUser; - private WarehouseS3Credentials s3Credentials; public WarehouseServiceAT() { warehouseToken = getProperty("warehouseToken"); @@ -64,15 +58,6 @@ public void initIsolatedDomainGroup() { account = gd.getAccountService().createAccount(new Account(LOGIN, "nnPvcGXU7f", "FirstName", "LastName"), getProperty("domain")); } - @Test(groups = "warehouse", dependsOnGroups = "account") - public void createWarehouse() throws Exception { - final Warehouse wh = new Warehouse(title, warehouseToken); - wh.setEnvironment(Environment.TESTING); - warehouse = service.createWarehouse(wh).get(60, TimeUnit.MINUTES); - s3Credentials = new WarehouseS3Credentials(S3_CREDENTIALS_REGION, S3_CREDENTIALS_ACCESS_KEY, "secret"); - String jdbc = warehouse.getConnectionUrl(); - } - @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") public void getWarehouse() throws Exception { final Warehouse warehouse = service.getWarehouseById(this.warehouse.getId()); @@ -156,48 +141,6 @@ public void getDefaultWarehouseSchema() { assertThat(warehouseSchema, is(notNullValue())); } - @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") - public void addS3Credentials() { - s3Credentials = service.addS3Credentials(warehouse, s3Credentials) - .get(1, TimeUnit.MINUTES); - - assertThat(s3Credentials, notNullValue()); - } - - @Test(groups = "warehouse", dependsOnMethods = "addS3Credentials") - public void updateS3Credentials() { - final DateTime lastUpdated = s3Credentials.getUpdated(); - s3Credentials.setSecretKey("newSecretKey"); - s3Credentials = service.updateS3Credentials(s3Credentials) - .get(1, TimeUnit.MINUTES); - - assertThat(s3Credentials, notNullValue()); - assertThat(s3Credentials.getUpdated(), is(not(lastUpdated))); - } - - @Test(groups = "warehouse", dependsOnMethods = "updateS3Credentials") - public void getS3SpecificCredentials() { - final WarehouseS3Credentials result = service.getWarehouseS3Credentials(warehouse, S3_CREDENTIALS_REGION, - S3_CREDENTIALS_ACCESS_KEY); - - assertThat(result, notNullValue()); - assertThat(result.getAccessKey(), is(S3_CREDENTIALS_ACCESS_KEY)); - } - - @Test(groups = "warehouse", dependsOnMethods = "updateS3Credentials") - public void listS3Credentials() { - final PageableList result = service.listWarehouseS3Credentials(warehouse); - - assertThat(result, notNullValue()); - assertThat(result.size(), is(1)); - assertThat(result.getNextPage(), nullValue()); - } - - @Test(groups = "warehouse", dependsOnMethods = { "listS3Credentials", "getS3SpecificCredentials" }) - public void removeS3Credentials() { - service.removeS3Credentials(s3Credentials).get(1, TimeUnit.MINUTES); - } - @Test(dependsOnGroups = "warehouse") public void removeWarehouse() throws Exception { service.removeWarehouse(warehouse); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 2b7bad4b0..4e02c4ae5 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -14,8 +14,6 @@ import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matchers; -import org.joda.time.DateTime; -import org.springframework.web.client.RestClientException; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -25,14 +23,11 @@ import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readFromResource; import static com.gooddata.util.ResourceUtils.readObjectFromResource; -import static com.gooddata.util.ResourceUtils.readStringFromResource; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.verifyThatRequest; -import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.Is.is; @@ -47,31 +42,18 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { private static final String WAREHOUSE = "/warehouse/warehouse.json"; private static final String WAREHOUSE_USER = "/warehouse/user.json"; private static final String WAREHOUSE_SCHEMA = "/warehouse/schema.json"; - private static final String S3_CREDENTIALS_CREATE = "/warehouse/s3Credentials-create.json"; - private static final String S3_CREDENTIALS_UPDATE = "/warehouse/s3Credentials-update.json"; - private static final String REGION = "region"; - private static final String ACCESS_KEY = "accessKey"; - private static final String SECRET_KEY = "secretKey"; - private static final String NEW_SECRET_KEY = "newSecretKey"; private static final String WAREHOUSE_URI = Warehouse.TEMPLATE.expand(WAREHOUSE_ID).toString(); private static final String WAREHOUSE_USER_URI = WarehouseUsers.TEMPLATE.expand(WAREHOUSE_ID).toString(); - private static final String WAREHOUSE_S3_CREDENTIALS_LIST_URI = WarehouseS3CredentialsList.TEMPLATE.expand(WAREHOUSE_ID).toString(); - private static final String WAREHOUSE_S3_CREDENTIALS_URI = WarehouseS3Credentials.TEMPLATE.expand(WAREHOUSE_ID, REGION, ACCESS_KEY).toString(); private static final String REMOVE_USER_TASK_DONE = "/warehouse/removeUserTask-finished.json"; private static final String UPDATED_BY_URI = Account.TEMPLATE.expand("updatedBy").toString(); private static final String CONNECTION_URL = "CONNECTION_URL"; - private static final WarehouseS3Credentials.Links LINKS = new WarehouseS3Credentials.Links( - WAREHOUSE_S3_CREDENTIALS_URI, WAREHOUSE_S3_CREDENTIALS_LIST_URI, WAREHOUSE_URI, UPDATED_BY_URI - ); private WarehouseTask pollingTask; private WarehouseTask finishedTask; private Warehouse warehouse; private WarehouseSchema warehouseSchema; - private WarehouseS3Credentials s3Credentials; - private WarehouseS3Credentials s3CredentialsWithLinks; @BeforeClass public void setUp() throws Exception { @@ -79,8 +61,6 @@ public void setUp() throws Exception { finishedTask = readObjectFromResource(TASK_DONE, WarehouseTask.class); warehouse = readObjectFromResource(WAREHOUSE, Warehouse.class); warehouseSchema = readObjectFromResource(WAREHOUSE_SCHEMA, WarehouseSchema.class); - s3Credentials = new WarehouseS3Credentials(REGION, ACCESS_KEY, SECRET_KEY); - s3CredentialsWithLinks = new WarehouseS3Credentials(REGION, ACCESS_KEY, SECRET_KEY, DateTime.now(), LINKS); } @Test @@ -424,331 +404,4 @@ public void shouldFailWarehouseSchemaByNameNotFound() throws Exception { assertThat(result.getName(), is(SCHEMA_NAME)); } - @Test - public void shouldListWarehouseS3Credentials() { - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_LIST_URI) - .respond() - .withBody(readFromResource("/warehouse/s3CredentialsList.json")) - .withStatus(200); - - final PageableList credentials = gd.getWarehouseService().listWarehouseS3Credentials(warehouse); - - assertThat(credentials, notNullValue()); - assertThat(credentials, hasSize(2)); - assertThat(credentials.get(0).getRegion(), is(REGION)); - assertThat(credentials.get(0).getAccessKey(), is(ACCESS_KEY)); - } - - @Test(expectedExceptions = GoodDataException.class, expectedExceptionsMessageRegExp = ".*Unable to list Warehouse S3 credentials.*") - public void shouldFailToListWarehouseS3Credentials_restClientError() { - onRequest().respondUsing(request -> { - throw new RestClientException("error"); - }); - - gd.getWarehouseService().listWarehouseS3Credentials(warehouse); - } - - @Test - public void shouldGetSpecificWarehouseS3Credentials() { - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(WarehouseS3Credentials.TEMPLATE.expand(WAREHOUSE_ID, REGION, ACCESS_KEY).toString()) - .respond() - .withBody(readFromResource("/warehouse/s3Credentials-get.json")) - .withStatus(200); - - final WarehouseS3Credentials credentials = gd.getWarehouseService() - .getWarehouseS3Credentials(warehouse, REGION, ACCESS_KEY); - - assertThat(credentials, notNullValue()); - assertThat(credentials.getRegion(), is(REGION)); - assertThat(credentials.getAccessKey(), is(ACCESS_KEY)); - } - - @Test(expectedExceptions = WarehouseS3CredentialsNotFoundException.class) - public void shouldFailToGetSpecificWarehouseS3Credentials_credentialsNotFound() { - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(WarehouseS3Credentials.TEMPLATE.expand(warehouse.getId(), REGION, ACCESS_KEY).toString()) - .respond() - .withStatus(404); - - gd.getWarehouseService().getWarehouseS3Credentials(warehouse, REGION, ACCESS_KEY); - } - - @Test(expectedExceptions = GoodDataException.class, expectedExceptionsMessageRegExp = ".*Service Unavailable$") - public void shouldFailToGetSpecificWarehouseS3Credentials_serviceNotFound() { - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(WarehouseS3Credentials.TEMPLATE.expand(warehouse.getId(), REGION, ACCESS_KEY).toString()) - .respond() - .withStatus(503); - - gd.getWarehouseService().getWarehouseS3Credentials(warehouse, REGION, ACCESS_KEY); - } - - @Test - public void shouldAddS3Credentials() { - onRequest() - .havingMethodEqualTo("POST") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_LIST_URI) - .havingBody(jsonEquals(readStringFromResource(S3_CREDENTIALS_CREATE))) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(202) - .thenRespond() - .withBody(readFromResource(TASK_DONE)) - .withStatus(201); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseS3CredentialsUri()) - .respond() - .withBody(readFromResource("/warehouse/s3Credentials-get.json")) - .withStatus(200); - - final WarehouseS3Credentials created = gd.getWarehouseService().addS3Credentials(warehouse, s3Credentials).get(); - assertThat(created, notNullValue()); - assertThat(created.getRegion(), is(REGION)); - assertThat(created.getAccessKey(), is(ACCESS_KEY)); - assertThat(created.getSecretKey(), is(nullValue())); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Unable to add S3 credentials in warehouse, uri: /gdc/datawarehouse/instances/instanceId/s3/region/accessKey$") - public void shouldFailToAddS3Credentials_failOnPoll() throws Exception { - onRequest() - .havingMethodEqualTo("POST") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_LIST_URI) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(409); - - gd.getWarehouseService().addS3Credentials(warehouse, s3Credentials).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Unable to POST S3 credentials /gdc/datawarehouse/instances/instanceId/s3 with region: region, access key: accessKey") - public void shouldFailToAddS3Credentials_failOnPost() throws Exception { - onRequest() - .havingMethodEqualTo("POST") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_LIST_URI) - .respond() - .withStatus(409); - - gd.getWarehouseService().addS3Credentials(warehouse, s3Credentials).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Attempt to add S3 credentials in warehouse failed, can't get the result, uri: /gdc/datawarehouse/instances/instanceId/s3/region/accessKey$") - public void shouldFailToAddS3Credentials_failOnResult() { - onRequest() - .havingMethodEqualTo("POST") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_LIST_URI) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(202) - .thenRespond() - .withBody(readFromResource(TASK_DONE)) - .withStatus(201); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseS3CredentialsUri()) - .respond() - .withStatus(409); - - gd.getWarehouseService().addS3Credentials(warehouse, s3Credentials).get(); - } - - - @Test - public void shouldUpdateS3Credentials() { - onRequest() - .havingMethodEqualTo("PUT") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .havingBody(jsonEquals(readStringFromResource(S3_CREDENTIALS_UPDATE))) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(202) - .thenRespond() - .withBody(readFromResource(TASK_DONE)) - .withStatus(200); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseS3CredentialsUri()) - .respond() - .withBody(readFromResource("/warehouse/s3Credentials-get.json")) - .withStatus(200); - - final WarehouseS3Credentials credentials = gd.getWarehouseService() - .getWarehouseS3Credentials(warehouse, s3Credentials.getRegion(), s3Credentials.getAccessKey()); - credentials.setSecretKey(NEW_SECRET_KEY); - - final WarehouseS3Credentials updated = gd.getWarehouseService() - .updateS3Credentials(credentials).get(); - assertThat(updated, notNullValue()); - assertThat(updated.getRegion(), is(REGION)); - assertThat(updated.getAccessKey(), is(ACCESS_KEY)); - assertThat(updated.getSecretKey(), is(nullValue())); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Unable to update S3 credentials in warehouse, uri: /gdc/datawarehouse/instances/instanceId/s3/region/accessKey$") - public void shouldFailToUpdateS3Credentials_failOnPoll() throws Exception { - onRequest() - .havingMethodEqualTo("PUT") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(409); - - gd.getWarehouseService().updateS3Credentials(s3CredentialsWithLinks).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Unable to PUT S3 credentials /gdc/datawarehouse/instances/instanceId/s3/region/accessKey with region: region, access key: accessKey") - public void shouldFailToUpdateS3Credentials_failOnPut() throws Exception { - onRequest() - .havingMethodEqualTo("PUT") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .respond() - .withStatus(409); - - gd.getWarehouseService().updateS3Credentials(s3CredentialsWithLinks).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Attempt to update S3 credentials in warehouse failed, can't get the result, uri: /gdc/datawarehouse/instances/instanceId/s3/region/accessKey$") - public void shouldFailToUpdateS3Credentials_failOnResult() { - onRequest() - .havingMethodEqualTo("PUT") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(202) - .thenRespond() - .withBody(readFromResource(TASK_DONE)) - .withStatus(200); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseS3CredentialsUri()) - .respond() - .withStatus(409); - - gd.getWarehouseService().updateS3Credentials(s3CredentialsWithLinks).get(); - } - - @Test - public void shouldRemoveS3Credentials() { - onRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .havingBodyEqualTo("") - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(202) - .thenRespond() - .withBody(readFromResource(TASK_DONE)) - .withStatus(200); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseS3CredentialsUri()) - .respond() - .withBody(readFromResource("/warehouse/s3CredentialsList.json")) - .withStatus(200); - - gd.getWarehouseService().removeS3Credentials(s3CredentialsWithLinks).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Unable to delete S3 credentials in warehouse, uri: /gdc/datawarehouse/instances/instanceId/s3/region/accessKey$") - public void shouldFailToRemoveS3Credentials_failOnPoll() throws Exception { - onRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(409); - - gd.getWarehouseService().removeS3Credentials(s3CredentialsWithLinks).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Unable to DELETE S3 credentials /gdc/datawarehouse/instances/instanceId/s3/region/accessKey with region: region, access key: accessKey") - public void shouldFailToRemoveS3Credentials_failOnDelete() throws Exception { - onRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .respond() - .withStatus(409); - - gd.getWarehouseService().removeS3Credentials(s3CredentialsWithLinks).get(); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, - expectedExceptionsMessageRegExp = ".*Attempt to delete S3 credentials in warehouse failed, can't get the result, uri: /gdc/datawarehouse/instances/instanceId/s3/region/accessKey$") - public void shouldFailToRemoveS3Credentials_failOnResult() { - onRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(WAREHOUSE_S3_CREDENTIALS_URI) - .respond() - .withBody(readFromResource(TASK_POLL)) - .withStatus(202); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollUri()) - .respond() - .withStatus(202) - .thenRespond() - .withBody(readFromResource(TASK_DONE)) - .withStatus(200); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseS3CredentialsUri()) - .respond() - .withStatus(409); - - gd.getWarehouseService().removeS3Credentials(s3CredentialsWithLinks).get(); - } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceTest.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceTest.java deleted file mode 100644 index 1ae77fe53..000000000 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata.warehouse; - -import com.gooddata.GoodDataSettings; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyCollection; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class WarehouseServiceTest { - private WarehouseService service; - - private WarehouseS3Credentials s3Credentials = new WarehouseS3Credentials("region", "accessKey", "secretKey"); - - @Mock - private Warehouse warehouse; - @Mock - private RestTemplate restTemplate; - - @BeforeMethod - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - service = new WarehouseService(restTemplate, new GoodDataSettings()); - when(warehouse.getId()).thenReturn("instanceId"); - } - - @Test(expectedExceptions = WarehouseS3CredentialsException.class, expectedExceptionsMessageRegExp = ".*Unable to POST S3 credentials.*") - public void addS3Credentials_shouldFailUponEmptyResponse() { - when(restTemplate.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class), any(Class.class), anyCollection())) - .thenReturn(null); - service.addS3Credentials(warehouse, s3Credentials); - } -} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index ae094ce87..0960672c4 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -27,7 +27,6 @@ public void testDeserializeInstance() throws Exception { final WarehouseTask warehouseTask = readObjectFromResource("/warehouse/warehouseTask-finished.json", WarehouseTask.class); assertThat(warehouseTask.getWarehouseLink(), is("/gdc/datawarehouse/instances/instanceId")); assertThat(warehouseTask.getWarehouseUri(), is("/gdc/datawarehouse/instances/instanceId")); - assertThat(warehouseTask.getWarehouseS3CredentialsUri(), is("/gdc/datawarehouse/instances/instanceId/s3/region/accessKey")); } } diff --git a/src/test/resources/warehouse/s3Credentials-create.json b/src/test/resources/warehouse/s3Credentials-create.json deleted file mode 100644 index 50a975802..000000000 --- a/src/test/resources/warehouse/s3Credentials-create.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "s3Credentials": { - "region": "region", - "accessKey": "accessKey", - "secretKey": "secretKey" - } -} diff --git a/src/test/resources/warehouse/s3Credentials-get.json b/src/test/resources/warehouse/s3Credentials-get.json deleted file mode 100644 index 0c657593c..000000000 --- a/src/test/resources/warehouse/s3Credentials-get.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "s3Credentials": { - "region": "region", - "accessKey": "accessKey", - "updated": "2017-08-02T09:40:24.064Z", - "links": { - "self": "/gdc/datawarehouse/instances/instanceId/s3/region/accessKey", - "parent": "/gdc/datawarehouse/instances/instanceId/s3", - "instance": "/gdc/datawarehouse/instances/instanceId", - "updatedBy": "/gdc/datawarehouse/instances/instanceId/users/{user-id}" - } - } -} diff --git a/src/test/resources/warehouse/s3Credentials-update.json b/src/test/resources/warehouse/s3Credentials-update.json deleted file mode 100644 index a0e5e7342..000000000 --- a/src/test/resources/warehouse/s3Credentials-update.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "s3Credentials": { - "region": "region", - "accessKey": "accessKey", - "secretKey": "newSecretKey" - } -} diff --git a/src/test/resources/warehouse/s3CredentialsList.json b/src/test/resources/warehouse/s3CredentialsList.json deleted file mode 100644 index 8555cb1bc..000000000 --- a/src/test/resources/warehouse/s3CredentialsList.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "s3CredentialsList": { - "items": [ - { - "s3Credentials": { - "region": "region", - "accessKey": "accessKey", - "secretKey": "secretKey", - "updated": "2017-08-02T09:40:24.064Z", - "links": { - "self": "/gdc/datawarehouse/instances/{instance-id}/s3/region/accessKey", - "parent": "/gdc/datawarehouse/instances/{instance-id}/s3", - "instance": "/gdc/datawarehouse/instances/{instance-id}", - "updatedBy": "/gdc/datawarehouse/instances/{instance-id}/users/{user-id}" - } - } - }, - { - "s3Credentials": { - "region": "region2", - "accessKey": "accessKey2", - "secretKey": "secretKey2" - } - } - ], - "paging": {}, - "links": { - "parent": "/gdc/datawarehouse/instances/{instance-id}", - "self": "/gdc/datawarehouse/instances/{instance-id}/s3" - } - } -} diff --git a/src/test/resources/warehouse/warehouseTask-finished.json b/src/test/resources/warehouse/warehouseTask-finished.json index c17ec01c8..27ccccf5c 100644 --- a/src/test/resources/warehouse/warehouseTask-finished.json +++ b/src/test/resources/warehouse/warehouseTask-finished.json @@ -3,8 +3,7 @@ "links": { "instance": "/gdc/datawarehouse/instances/instanceId", "user": "/gdc/datawarehouse/instances/instanceId/users/userId", - "users": "/gdc/datawarehouse/instances/instanceId/users", - "s3Credentials": "/gdc/datawarehouse/instances/instanceId/s3/region/accessKey" + "users": "/gdc/datawarehouse/instances/instanceId/users" } } } From e02ae12a0a1a4cae5ceadf80633e1878d5493920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Thu, 11 Oct 2018 10:52:31 +0200 Subject: [PATCH 104/548] Fix dependency in WarehouseServiceAT --- .../java/com/gooddata/warehouse/WarehouseServiceAT.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index d6fcfd951..17c891621 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -58,6 +58,13 @@ public void initIsolatedDomainGroup() { account = gd.getAccountService().createAccount(new Account(LOGIN, "nnPvcGXU7f", "FirstName", "LastName"), getProperty("domain")); } + @Test(groups = "warehouse", dependsOnGroups = "account") + public void createWarehouse() throws Exception { + final Warehouse wh = new Warehouse(title, warehouseToken); + wh.setEnvironment(Environment.TESTING); + warehouse = service.createWarehouse(wh).get(60, TimeUnit.MINUTES); + } + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") public void getWarehouse() throws Exception { final Warehouse warehouse = service.getWarehouseById(this.warehouse.getId()); From 5992b57bc15f916340c1f84960bdbcf5a53adbdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 09:51:14 +0000 Subject: [PATCH 105/548] Bump jadler.version from 1.1.1 to 1.3.0 Bumps `jadler.version` from 1.1.1 to 1.3.0. Updates `jadler-core` from 1.1.1 to 1.3.0 - [Release notes](https://github.com/jadler-mocking/jadler/releases) - [Changelog](https://github.com/jadler-mocking/jadler/blob/master/RELEASENOTES.md) - [Commits](https://github.com/jadler-mocking/jadler/compare/jadler-pom-1.1.1...jadler-pom-1.3.0) Updates `jadler-all` from 1.1.1 to 1.3.0 - [Release notes](https://github.com/jadler-mocking/jadler/releases) - [Changelog](https://github.com/jadler-mocking/jadler/blob/master/RELEASENOTES.md) - [Commits](https://github.com/jadler-mocking/jadler/compare/jadler-pom-1.1.1...jadler-pom-1.3.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b9f14af5b..96f7c77cf 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 2.8.11 2.8.11.2 4.3.18.RELEASE - 1.1.1 + 1.3.0 1.23.0 2.20.1 2.20.1 From 38b105693f6bd95b5cc8f68664f126babe1a86b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 09:51:18 +0000 Subject: [PATCH 106/548] Bump build-helper-maven-plugin from 1.9.1 to 3.0.0 Bumps [build-helper-maven-plugin](https://github.com/mojohaus/build-helper-maven-plugin) from 1.9.1 to 3.0.0. - [Release notes](https://github.com/mojohaus/build-helper-maven-plugin/releases) - [Commits](https://github.com/mojohaus/build-helper-maven-plugin/compare/build-helper-maven-plugin-1.9.1...build-helper-maven-plugin-3.0.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b9f14af5b..164b40b47 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ org.codehaus.mojo build-helper-maven-plugin - 1.9.1 + 3.0.0 set-animalSnifferJdkVersion-property From 06a0ac427fcf589ac5a89c0d0a0782cf905e5ba0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:31 +0000 Subject: [PATCH 107/548] Bump gooddata-rest-common from 1.2.1 to 1.2.2 Bumps [gooddata-rest-common](https://github.com/gooddata/gooddata-rest-common) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/gooddata/gooddata-rest-common/releases) - [Commits](https://github.com/gooddata/gooddata-rest-common/commits/gooddata-rest-common-1.2.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96f7c77cf..b5016444b 100644 --- a/pom.xml +++ b/pom.xml @@ -258,7 +258,7 @@ com.gooddata gooddata-rest-common - 1.2.1 + 1.2.2 com.gooddata From 49f00714377bb54923df8241e5541a8a81c281bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:39 +0000 Subject: [PATCH 108/548] Bump sardine from 5.1 to 5.8 Bumps [sardine](https://github.com/lookfirst/sardine) from 5.1 to 5.8. - [Release notes](https://github.com/lookfirst/sardine/releases) - [Commits](https://github.com/lookfirst/sardine/compare/sardine-5.1...sardine-5.8) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96f7c77cf..6b368a938 100644 --- a/pom.xml +++ b/pom.xml @@ -329,7 +329,7 @@ com.github.lookfirst sardine - 5.1 + 5.8 joda-time From 7215cc74f4405de39d48def297bc18df7221d00f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:41 +0000 Subject: [PATCH 109/548] Bump maven-failsafe-plugin from 2.20.1 to 2.22.0 Bumps [maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 2.20.1 to 2.22.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.20.1...surefire-2.22.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96f7c77cf..da3896694 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 1.3.0 1.23.0 2.20.1 - 2.20.1 + 2.22.0 From ca9c38ff4c2e84148a0c5e9738911d084b207fc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:49 +0000 Subject: [PATCH 110/548] Bump json-unit.version from 1.23.0 to 1.31.1 Bumps `json-unit.version` from 1.23.0 to 1.31.1. Updates `json-unit` from 1.23.0 to 1.31.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-1.23.0...json-unit-parent-1.31.1) Updates `json-unit-core` from 1.23.0 to 1.31.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-1.23.0...json-unit-parent-1.31.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96f7c77cf..e4cf04684 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 1.23.0 + 1.31.1 2.20.1 2.20.1 From ef5fce08e014510245c1d46381560a703c0233ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:27:10 +0000 Subject: [PATCH 111/548] Bump surefire.version from 2.20.1 to 2.22.0 Bumps `surefire.version` from 2.20.1 to 2.22.0. Updates `surefire-junit47` from 2.20.1 to 2.22.0 Updates `surefire-testng` from 2.20.1 to 2.22.0 Updates `maven-surefire-plugin` from 2.20.1 to 2.22.0 - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.20.1...surefire-2.22.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf2538ce0..a17503ccf 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 4.3.18.RELEASE 1.3.0 1.31.1 - 2.20.1 + 2.22.0 2.22.0 From 78acd985d8ae5c639a9112827a453ef3a0fa8d84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 13:19:05 +0000 Subject: [PATCH 112/548] Bump equalsverifier from 2.4.2 to 3.0 Bumps [equalsverifier](https://github.com/jqno/equalsverifier) from 2.4.2 to 3.0. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-2.4.2...equalsverifier-3.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a17503ccf..abe45dc16 100644 --- a/pom.xml +++ b/pom.xml @@ -412,7 +412,7 @@ nl.jqno.equalsverifier equalsverifier - 2.4.2 + 3.0 test From 94769662ecb01cf72d642245f2d21982ccc9904e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 13:19:13 +0000 Subject: [PATCH 113/548] Bump surefire.version from 2.22.0 to 2.22.1 Bumps `surefire.version` from 2.22.0 to 2.22.1. Updates `surefire-junit47` from 2.22.0 to 2.22.1 Updates `surefire-testng` from 2.22.0 to 2.22.1 Updates `maven-surefire-plugin` from 2.22.0 to 2.22.1 - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.22.0...surefire-2.22.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a17503ccf..5271a1c1e 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 4.3.18.RELEASE 1.3.0 1.31.1 - 2.22.0 + 2.22.1 2.22.0 From c6cc0eafc8236f9b7583dd057c1af6b399fd3d51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 13:19:13 +0000 Subject: [PATCH 114/548] Bump cglib-nodep from 3.2.5 to 3.2.8 Bumps [cglib-nodep](https://github.com/cglib/cglib) from 3.2.5 to 3.2.8. - [Release notes](https://github.com/cglib/cglib/releases) - [Commits](https://github.com/cglib/cglib/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a17503ccf..8c033f5ad 100644 --- a/pom.xml +++ b/pom.xml @@ -430,7 +430,7 @@ cglib cglib-nodep - 3.2.5 + 3.2.8 test From 3154f70c71c0b134606a629ccd203a8540e2ae31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 13:19:15 +0000 Subject: [PATCH 115/548] Bump animal-sniffer-maven-plugin from 1.14 to 1.17 Bumps [animal-sniffer-maven-plugin](https://github.com/mojohaus/animal-sniffer) from 1.14 to 1.17. - [Release notes](https://github.com/mojohaus/animal-sniffer/releases) - [Commits](https://github.com/mojohaus/animal-sniffer/compare/animal-sniffer-parent-1.14...animal-sniffer-parent-1.17) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a17503ccf..cbc844645 100644 --- a/pom.xml +++ b/pom.xml @@ -95,7 +95,7 @@ org.codehaus.mojo animal-sniffer-maven-plugin - 1.14 + 1.17 org.codehaus.mojo.signature From 3d2eae55a5a38d07057770c905a86e909447d418 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 09:51:24 +0000 Subject: [PATCH 116/548] Bump jackson.version from 2.8.11 to 2.9.7 Bumps `jackson.version` from 2.8.11 to 2.9.7. Updates `jackson-core` from 2.8.11 to 2.9.7 - [Release notes](https://github.com/FasterXML/jackson-core/releases) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.8.11...jackson-core-2.9.7) Updates `jackson-annotations` from 2.8.11 to 2.9.7 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b9f14af5b..050cb2d15 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ 4.5.6 4.4.10 - 2.8.11 + 2.9.7 2.8.11.2 4.3.18.RELEASE 1.1.1 From a971eee63ccea772475dc8f59a6928fbe044a268 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 09:51:14 +0000 Subject: [PATCH 117/548] Bump jadler.version from 1.1.1 to 1.3.0 Bumps `jadler.version` from 1.1.1 to 1.3.0. Updates `jadler-core` from 1.1.1 to 1.3.0 - [Release notes](https://github.com/jadler-mocking/jadler/releases) - [Changelog](https://github.com/jadler-mocking/jadler/blob/master/RELEASENOTES.md) - [Commits](https://github.com/jadler-mocking/jadler/compare/jadler-pom-1.1.1...jadler-pom-1.3.0) Updates `jadler-all` from 1.1.1 to 1.3.0 - [Release notes](https://github.com/jadler-mocking/jadler/releases) - [Changelog](https://github.com/jadler-mocking/jadler/blob/master/RELEASENOTES.md) - [Commits](https://github.com/jadler-mocking/jadler/compare/jadler-pom-1.1.1...jadler-pom-1.3.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b9f14af5b..96f7c77cf 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 2.8.11 2.8.11.2 4.3.18.RELEASE - 1.1.1 + 1.3.0 1.23.0 2.20.1 2.20.1 From 107bc8a9898a62e0092ca4fb672d56ad87175aa7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:31 +0000 Subject: [PATCH 118/548] Bump gooddata-rest-common from 1.2.1 to 1.2.2 Bumps [gooddata-rest-common](https://github.com/gooddata/gooddata-rest-common) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/gooddata/gooddata-rest-common/releases) - [Commits](https://github.com/gooddata/gooddata-rest-common/commits/gooddata-rest-common-1.2.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96f7c77cf..b5016444b 100644 --- a/pom.xml +++ b/pom.xml @@ -258,7 +258,7 @@ com.gooddata gooddata-rest-common - 1.2.1 + 1.2.2 com.gooddata From b60c789b1386fe485d160c5a42d4e52569f927fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:41 +0000 Subject: [PATCH 119/548] Bump maven-failsafe-plugin from 2.20.1 to 2.22.0 Bumps [maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 2.20.1 to 2.22.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.20.1...surefire-2.22.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b5016444b..d0d8423fb 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 1.3.0 1.23.0 2.20.1 - 2.20.1 + 2.22.0 From 2491877a261b24803cdfb145c0205ad1c94de3c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:18:49 +0000 Subject: [PATCH 120/548] Bump json-unit.version from 1.23.0 to 1.31.1 Bumps `json-unit.version` from 1.23.0 to 1.31.1. Updates `json-unit` from 1.23.0 to 1.31.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-1.23.0...json-unit-parent-1.31.1) Updates `json-unit-core` from 1.23.0 to 1.31.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-1.23.0...json-unit-parent-1.31.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d0d8423fb..cf2538ce0 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 1.23.0 + 1.31.1 2.20.1 2.22.0 From 6fff275e5214057f9a6599d8e75a469c33398823 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Oct 2018 13:27:10 +0000 Subject: [PATCH 121/548] Bump surefire.version from 2.20.1 to 2.22.0 Bumps `surefire.version` from 2.20.1 to 2.22.0. Updates `surefire-junit47` from 2.20.1 to 2.22.0 Updates `surefire-testng` from 2.20.1 to 2.22.0 Updates `maven-surefire-plugin` from 2.20.1 to 2.22.0 - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.20.1...surefire-2.22.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf2538ce0..a17503ccf 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 4.3.18.RELEASE 1.3.0 1.31.1 - 2.20.1 + 2.22.0 2.22.0 From f38f28d1d2d53849c6ffc3ea686252a32d401725 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 13:18:59 +0000 Subject: [PATCH 122/548] Bump jackson-databind from 2.8.11.2 to 2.9.7 Bumps [jackson-databind](https://github.com/FasterXML/jackson) from 2.8.11.2 to 2.9.7. - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b4d6b925..77a5638cd 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ 4.5.6 4.4.10 2.9.7 - 2.8.11.2 + 2.9.7 4.3.18.RELEASE 1.3.0 1.31.1 From 8269117cbc6d72a0a042116aedec1cb0cc4d89c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 20:37:00 +0000 Subject: [PATCH 123/548] Bump groovy-all from 2.4.12 to 2.4.15 Bumps [groovy-all](https://github.com/apache/groovy) from 2.4.12 to 2.4.15. - [Release notes](https://github.com/apache/groovy/releases) - [Commits](https://github.com/apache/groovy/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1ad0855b..baf32c5ef 100644 --- a/pom.xml +++ b/pom.xml @@ -424,7 +424,7 @@ org.codehaus.groovy groovy-all - 2.4.12 + 2.4.15 test From cda243b73a1f6433c7b405a16e1e298cd02f900b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 20:37:01 +0000 Subject: [PATCH 124/548] Bump commons-io from 2.4 to 2.6 Bumps commons-io from 2.4 to 2.6. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1ad0855b..119748e9c 100644 --- a/pom.xml +++ b/pom.xml @@ -340,7 +340,7 @@ commons-io commons-io - 2.4 + 2.6 test From 2fd69d9044e4a924de2d75fa420d7da7aee03a89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 20:37:02 +0000 Subject: [PATCH 125/548] Bump joda-time from 2.7 to 2.10 Bumps [joda-time](https://github.com/JodaOrg/joda-time) from 2.7 to 2.10. - [Release notes](https://github.com/JodaOrg/joda-time/releases) - [Changelog](https://github.com/JodaOrg/joda-time/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/JodaOrg/joda-time/compare/v2.7...v2.10) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1ad0855b..f433dd96c 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,7 @@ joda-time joda-time - 2.7 + 2.10 From 0ac985b2ade8d61520c53a3f733511c567b98e86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 20:37:04 +0000 Subject: [PATCH 126/548] Bump commons-lang3 from 3.5 to 3.8.1 Bumps commons-lang3 from 3.5 to 3.8.1. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1ad0855b..19d720bd1 100644 --- a/pom.xml +++ b/pom.xml @@ -268,7 +268,7 @@ org.apache.commons commons-lang3 - 3.5 + 3.8.1 org.apache.httpcomponents From e6a2202460d21d5ca28d016cd146f72ba05114f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Oct 2018 20:37:08 +0000 Subject: [PATCH 127/548] Bump testng from 6.8.21 to 6.14.3 Bumps [testng](https://github.com/cbeust/testng) from 6.8.21 to 6.14.3. - [Release notes](https://github.com/cbeust/testng/releases) - [Changelog](https://github.com/cbeust/testng/blob/master/CHANGES.txt) - [Commits](https://github.com/cbeust/testng/compare/testng-6.8.21...6.14.3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1ad0855b..3b09f8167 100644 --- a/pom.xml +++ b/pom.xml @@ -346,7 +346,7 @@ org.testng testng - 6.8.21 + 6.14.3 test From d12b872f1484052fa5fb439e67a09306687624d6 Mon Sep 17 00:00:00 2001 From: Lukas Slovak Date: Fri, 14 Sep 2018 12:52:24 +0200 Subject: [PATCH 128/548] In zendesk4 connector, we need to know if scheduler start a reload of some project --- .../connector/Zendesk4ProcessExecution.java | 15 ++++++++++++++- .../connector/Zendesk4ProcessExecutionTest.java | 17 ++++++++++++----- .../connector/process-execution-reload.json | 5 +++++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/connector/process-execution-reload.json diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 8a9f36286..f46fd57fa 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ @@ -28,6 +28,8 @@ public class Zendesk4ProcessExecution implements ProcessExecution { private Boolean incremental; + private Boolean reload; + private Map startTimes; private DownloadParams downloadParams; @@ -45,6 +47,17 @@ public void setIncremental(final Boolean incremental) { this.incremental = incremental; } + public Boolean getReload() { + return reload; + } + + /** + * set by scheduler, when the process is actually a reload of a project + */ + public void setReload(final Boolean reload) { + this.reload = reload; + } + @JsonAnyGetter @JsonSerialize(contentUsing = ISODateTimeSerializer.class) public Map getStartTimes() { diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java index 1561207ea..eb7939afa 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -18,19 +18,19 @@ public class Zendesk4ProcessExecutionTest { @Test - public void testShouldSerialize() throws Exception { + public void testShouldSerialize() { assertThat(new Zendesk4ProcessExecution(), jsonEquals(resource("connector/process-execution-empty.json"))); } @Test - public void testShouldSerializeIncremental() throws Exception { + public void testShouldSerializeIncremental() { final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); execution.setIncremental(true); assertThat(execution, jsonEquals(resource("connector/process-execution-incremental.json"))); } @Test - public void testShouldSerializeStartTimes() throws Exception { + public void testShouldSerializeStartTimes() { final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); execution.setIncremental(true); execution.setStartTime("tickets", new DateTime(0L)); @@ -38,14 +38,21 @@ public void testShouldSerializeStartTimes() throws Exception { } @Test - public void testShouldSerializeDownloadParams() throws Exception { + public void testShouldSerializeDownloadParams() { final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); execution.setDownloadParams(new DownloadParams(true, 5, 3600)); assertThat(execution, jsonEquals(resource("connector/process-execution-zendesk4-download.json"))); } @Test - public void testGetDownloadParams() throws Exception { + public void testShouldSerializeReload() { + final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); + execution.setReload(true); + assertThat(execution, jsonEquals(resource("connector/process-execution-reload.json"))); + } + + @Test + public void testGetDownloadParams() { final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); final DownloadParams downloadParams = execution.getDownloadParams(); assertThat(downloadParams, notNullValue()); diff --git a/src/test/resources/connector/process-execution-reload.json b/src/test/resources/connector/process-execution-reload.json new file mode 100644 index 000000000..356349bd6 --- /dev/null +++ b/src/test/resources/connector/process-execution-reload.json @@ -0,0 +1,5 @@ +{ + "process": { + "reload": true + } +} \ No newline at end of file From 88885c4b9884c958d4cc1b194b349894e44f680e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 15 Oct 2018 12:21:42 +0000 Subject: [PATCH 129/548] Bump coveralls-maven-plugin from 4.1.0 to 4.3.0 Bumps [coveralls-maven-plugin](https://github.com/trautonen/coveralls-maven-plugin) from 4.1.0 to 4.3.0. - [Release notes](https://github.com/trautonen/coveralls-maven-plugin/releases) - [Changelog](https://github.com/trautonen/coveralls-maven-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/trautonen/coveralls-maven-plugin/compare/v4.1.0...v4.3.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05e0c9b35..8a786707e 100644 --- a/pom.xml +++ b/pom.xml @@ -210,7 +210,7 @@ org.eluder.coveralls coveralls-maven-plugin - 4.1.0 + 4.3.0 org.jacoco From e3ee2fe758e0055c39389c79dd96863ee4fb6d3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 15 Oct 2018 12:21:50 +0000 Subject: [PATCH 130/548] Bump jacoco-maven-plugin from 0.7.2.201409121644 to 0.8.2 Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.7.2.201409121644 to 0.8.2. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/commits/v0.8.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05e0c9b35..8a3f352f0 100644 --- a/pom.xml +++ b/pom.xml @@ -215,7 +215,7 @@ org.jacoco jacoco-maven-plugin - 0.7.2.201409121644 + 0.8.2 jacoco-prepare-agent From e5b44b444bd5e5a39eb6512cd5a5d1d9301a0770 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 15 Oct 2018 13:19:38 +0000 Subject: [PATCH 131/548] Bump gmavenplus-plugin from 1.6 to 1.6.2 Bumps [gmavenplus-plugin](https://github.com/groovy/GMavenPlus) from 1.6 to 1.6.2. - [Release notes](https://github.com/groovy/GMavenPlus/releases) - [Commits](https://github.com/groovy/GMavenPlus/compare/1.6...1.6.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cd7c72c5e..7636e048a 100644 --- a/pom.xml +++ b/pom.xml @@ -132,7 +132,7 @@ org.codehaus.gmavenplus gmavenplus-plugin - 1.6 + 1.6.2 From 4281c6c5c82aa64eebf2ee583c467b560a000a18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 15 Oct 2018 13:19:57 +0000 Subject: [PATCH 132/548] Bump maven-failsafe-plugin from 2.22.0 to 2.22.1 Bumps [maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 2.22.0 to 2.22.1. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.22.0...surefire-2.22.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cd7c72c5e..63d6365cf 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 1.3.0 1.31.1 2.22.1 - 2.22.0 + 2.22.1 From 38dceb1534acbd8680bcb5189a434ec6c29866ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 15 Oct 2018 12:21:38 +0000 Subject: [PATCH 133/548] Bump spock-core from 1.1-groovy-2.4 to 1.2-groovy-2.4 Bumps spock-core from 1.1-groovy-2.4 to 1.2-groovy-2.4. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05e0c9b35..860bfaebe 100644 --- a/pom.xml +++ b/pom.xml @@ -418,7 +418,7 @@ org.spockframework spock-core - 1.1-groovy-2.4 + 1.2-groovy-2.4 test From 458131d34ad9aa3bc678bb68cd3aa9fac023b4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tos=CC=8Covsky=CC=81?= Date: Sun, 28 Oct 2018 22:07:39 +0100 Subject: [PATCH 134/548] added missing MD obj flags (AbstractObj.Meta.flags) property --- .../java/com/gooddata/md/AbstractObj.java | 16 +++- src/main/java/com/gooddata/md/Meta.java | 87 +++++++++++++++++-- .../java/com/gooddata/md/ScheduledMail.java | 4 +- .../java/com/gooddata/project/Project.java | 5 +- src/test/java/com/gooddata/md/MetaTest.java | 20 ++++- src/test/java/com/gooddata/md/ObjTest.java | 5 +- src/test/resources/md/meta-withFlags.json | 18 ++++ 7 files changed, 141 insertions(+), 14 deletions(-) create mode 100644 src/test/resources/md/meta-withFlags.json diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index 0f8dab755..153b939be 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -31,6 +31,7 @@ protected AbstractObj(@JsonProperty("meta") Meta meta) { /** * Returns internally generated ID of the object (that's part of the object URI). + * * @return internal ID of the object */ @JsonIgnore @@ -110,6 +111,7 @@ public void setDeprecated(Boolean deprecated) { /** * Returns user-specified identifier of the object. + * * @return user-specified object identifier */ @JsonIgnore @@ -157,17 +159,27 @@ public void setSharedWithSomeone(Boolean sharedWithSomeone) { meta.setSharedWithSomeone(sharedWithSomeone); } + @JsonIgnore + public Set getFlags() { + return meta.getFlags(); + } + + public void setFlags(final Set flags) { + meta.setFlags(flags); + } + /** * Get list of URIs of the given {@link Obj}s + * * @param objs metadata objects - * @param Obj type + * @param Obj type * @return list of URIs */ @SafeVarargs protected static String[] uris(T... objs) { noNullElements(objs, "objs"); final String[] uris = new String[objs.length]; - for (int i=0; i flags; @JsonCreator protected Meta(@JsonProperty("author") String author, @@ -57,7 +65,8 @@ protected Meta(@JsonProperty("author") String author, @JsonProperty("category") String category, @JsonProperty("tags") @JsonDeserialize(using = TagsDeserializer.class) Set tags, @JsonProperty("uri") String uri, - @JsonProperty("identifier") String identifier) { + @JsonProperty("identifier") String identifier, + @JsonProperty("flags") Set flags) { super(); this.author = author; this.uri = uri; @@ -69,11 +78,61 @@ protected Meta(@JsonProperty("author") String author, this.category = category; this.identifier = identifier; this.contributor = contributor; + this.flags = flags; } + /** + * @param author + * @param contributor + * @param created + * @param updated + * @param summary + * @param title + * @param category + * @param tags + * @param uri + * @param identifier + * @param deprecated + * @param production + * @param locked + * @param unlisted + * @param sharedWithSomeone + * @deprecated use {@link #Meta(String, String, DateTime, DateTime, String, String, String, Set, + * String, String, Boolean, Boolean, Boolean, Boolean, Boolean, Set)} instead + */ + @Deprecated public Meta(String author, String contributor, DateTime created, DateTime updated, String summary, - String title, String category, Set tags, String uri, String identifier, - Boolean deprecated, Boolean production, Boolean locked, Boolean unlisted, Boolean sharedWithSomeone) { + String title, String category, Set tags, String uri, String identifier, + Boolean deprecated, Boolean production, Boolean locked, Boolean unlisted, + Boolean sharedWithSomeone) { + this(author, contributor, created, updated, summary, title, category, tags, uri, identifier, + deprecated, production, locked, unlisted, sharedWithSomeone, null); + } + + /** + * Constructor with "extra" flags argument + * + * @param author + * @param contributor + * @param created + * @param updated + * @param summary + * @param title + * @param category + * @param tags + * @param uri + * @param identifier + * @param deprecated + * @param production + * @param locked + * @param unlisted + * @param sharedWithSomeone + * @param flags + */ + public Meta(String author, String contributor, DateTime created, DateTime updated, String summary, + String title, String category, Set tags, String uri, String identifier, + Boolean deprecated, Boolean production, Boolean locked, Boolean unlisted, + Boolean sharedWithSomeone, Set flags) { this.author = author; this.contributor = contributor; this.created = created; @@ -89,6 +148,7 @@ public Meta(String author, String contributor, DateTime created, DateTime update this.locked = locked; this.unlisted = unlisted; this.sharedWithSomeone = sharedWithSomeone; + this.flags = flags; } public Meta(String title) { @@ -102,6 +162,7 @@ public Meta(String title, String summary) { /** * Returns internally generated ID of the object (that's part of the object URI). + * * @return internal ID of the object */ @JsonIgnore @@ -166,6 +227,7 @@ public String getUri() { /** * Default is false/not-deprecated. + * * @return true when the linked object is deprecated, null if not set */ @JsonProperty("deprecated") @@ -182,6 +244,7 @@ public void setDeprecated(Boolean deprecated) { /** * Returns user-specified identifier of the object. + * * @return user-specified object identifier */ public String getIdentifier() { @@ -194,6 +257,7 @@ public void setIdentifier(String identifier) { /** * Is the object production or not? Defaults to true. + * * @return true when the linked object is production, null if not set */ @JsonProperty("isProduction") @@ -210,6 +274,7 @@ public void setProduction(final Boolean production) { /** * Flag that MD object is locked; default is false/unlocked. + * * @return true when the linked object is locked, null if not set */ @JsonProperty("locked") @@ -226,6 +291,7 @@ public void setLocked(Boolean locked) { /** * Default is false/listed. + * * @return true when the linked object is unlisted, null if not set */ @JsonProperty("unlisted") @@ -242,6 +308,7 @@ public void setUnlisted(Boolean unlisted) { /** * Is the linked object shared with someone via ACLs? + * * @return true when the linked object is shared, null if not set */ @JsonProperty("sharedWithSomeone") @@ -256,6 +323,14 @@ public void setSharedWithSomeone(final Boolean sharedWithSomeone) { this.sharedWithSomeone = sharedWithSomeone; } + public Set getFlags() { + return flags; + } + + public void setFlags(final Set flags) { + this.flags = flags; + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 0e6eb3b41..f5c712c63 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -41,7 +41,7 @@ private ScheduledMail(String title, String summary, Set tags, boolean de LocalDate startDate, String timeZone, Collection toAddresses, Collection bccAddresses, String subject, String body, List attachments) { super(new Meta(null, null, null, null, summary, title, null, tags, null, null, deprecated, null, false, false, - null)); + null, null)); notNull(toAddresses, "toAddresses"); notNull(subject, "subject"); notNull(body, "body"); @@ -58,7 +58,7 @@ private ScheduledMail(String title, String summary, Set tags, boolean de */ public ScheduledMail(String title, String summary) { super(new Meta(null, null, null, null, summary, title, null, Collections.emptySet(), null, null, false, - null, false, false, null)); + null, false, false, null, null)); this.content = new Content(); } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index c1ce46376..38afb9c52 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -663,9 +663,10 @@ private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("isProduction") @JsonDeserialize(using = BooleanDeserializer.class) Boolean production, @JsonProperty("locked") @JsonDeserialize(using = BooleanDeserializer.class) Boolean locked, @JsonProperty("unlisted") @JsonDeserialize(using = BooleanDeserializer.class) Boolean unlisted, - @JsonProperty("sharedWithSomeone") @JsonDeserialize(using = BooleanDeserializer.class) Boolean sharedWithSomeone) { + @JsonProperty("sharedWithSomeone") @JsonDeserialize(using = BooleanDeserializer.class) Boolean sharedWithSomeone, + @JsonProperty("flags") Set flags) { super(author, contributor, created, updated, summary, title, category, tags, uri, identifier, - deprecated, production, locked, unlisted, sharedWithSomeone); + deprecated, production, locked, unlisted, sharedWithSomeone, flags); } diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 0525262fa..47bdeed88 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -19,6 +19,7 @@ import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; @@ -40,6 +41,7 @@ public class MetaTest { public static final boolean UNLISTED = true; public static final boolean PRODUCTION = true; public static final boolean SHARED_WITH_SOMEONE = false; + public static final Set FLAGS = new LinkedHashSet<>(asList("preloaded", "strictAccessControl")); @Test public void testDeserialization() throws Exception { @@ -61,6 +63,7 @@ public void testDeserialization() throws Exception { assertThat(meta.isUnlisted(), is(UNLISTED)); assertThat(meta.isProduction(), is(PRODUCTION)); assertThat(meta.isSharedWithSomeone(), is(SHARED_WITH_SOMEONE)); + assertThat(meta.getFlags(), nullValue()); } @Test @@ -71,10 +74,25 @@ public void testSerialization() throws Exception { assertThat(meta, jsonEquals(resource("md/meta.json"))); } + @Test + public void testDeserializationWithFlags() throws Exception { + final Meta meta = readObjectFromResource("/md/meta-withFlags.json", Meta.class); + assertThat(meta, is(notNullValue())); + assertThat(meta.getFlags(), is(FLAGS)); + } + + @Test + public void testSerializationWithFlags() throws Exception { + final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, IDENTIFIER, + DEPRECATED, PRODUCTION, LOCKED, UNLISTED, SHARED_WITH_SOMEONE, FLAGS); + + assertThat(meta, jsonEquals(resource("md/meta-withFlags.json"))); + } + @Test public void testToStringFormat() { final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, IDENTIFIER, - DEPRECATED, PRODUCTION, LOCKED, UNLISTED, SHARED_WITH_SOMEONE); + DEPRECATED, PRODUCTION, LOCKED, UNLISTED, SHARED_WITH_SOMEONE, FLAGS); assertThat(meta.toString(), matchesPattern(Meta.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 45b0cfe7d..53f7a73bf 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -19,6 +19,7 @@ import static net.javacrumbs.jsonunit.core.util.ResourceUtils.resource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; public class ObjTest { @@ -57,15 +58,17 @@ public void testDeserialization() throws Exception { assertThat(obj.getIdentifier(), is(IDENTIFIER)); assertThat(obj.isLocked(), is(LOCKED)); assertThat(obj.isUnlisted(), is(UNLISTED)); + assertThat(obj.getFlags(), nullValue()); } @Test public void testSerialization() throws Exception { final ConcreteObj obj = new ConcreteObj( new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, IDENTIFIER, - DEPRECATED, null, LOCKED, UNLISTED, null) + DEPRECATED, null, LOCKED, UNLISTED, null, null) ); + assertThat(obj, jsonEquals(resource("md/objCommon.json"))); } diff --git a/src/test/resources/md/meta-withFlags.json b/src/test/resources/md/meta-withFlags.json new file mode 100644 index 000000000..372c115c6 --- /dev/null +++ b/src/test/resources/md/meta-withFlags.json @@ -0,0 +1,18 @@ +{ + "author": "/gdc/account/profile/USER_ID", + "uri": "/gdc/md/PROJECT_ID/obj/OBJ_ID", + "tags": "TAG1 TAG2", + "created": "2014-04-11 13:45:56", + "identifier": "attr.person.id.name", + "deprecated": "0", + "summary": "Obj summary", + "title": "Obj title", + "category": "attributeDisplayForm", + "updated": "2014-04-11 13:45:57", + "contributor": "/gdc/account/profile/CONTRIBUTOR_USER_ID", + "locked": 0, + "unlisted": 1, + "isProduction": 1, + "sharedWithSomeone": 0, + "flags" : [ "preloaded", "strictAccessControl"] +} From e52b4e4e1261ed86ad1792dfe6a18a6338de9f39 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 29 Oct 2018 11:06:05 +0100 Subject: [PATCH 135/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 949cc95bb..1d3bf102b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.29.0 + 2.30.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 24ec645d50f018cc1443f4eb36779d0370c31d9d Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 29 Oct 2018 11:09:46 +0100 Subject: [PATCH 136/548] [maven-release-plugin] prepare release gooddata-java-2.30.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 97aa756f4..081705c22 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.29.1-SNAPSHOT + 2.30.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.30.0 From 8c275a6e7bd6d7c28ef27bcf8b00840681f4d395 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 29 Oct 2018 11:09:47 +0100 Subject: [PATCH 137/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 081705c22..e74376a73 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.30.0 + 2.30.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.30.0 + HEAD From cc1cf12b96d55afa6edb82e22946dbac65218809 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 29 Oct 2018 13:20:20 +0000 Subject: [PATCH 138/548] Bump cglib-nodep from 3.2.8 to 3.2.9 Bumps [cglib-nodep](https://github.com/cglib/cglib) from 3.2.8 to 3.2.9. - [Release notes](https://github.com/cglib/cglib/releases) - [Commits](https://github.com/cglib/cglib/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e74376a73..2dc8c5bcb 100644 --- a/pom.xml +++ b/pom.xml @@ -430,7 +430,7 @@ cglib cglib-nodep - 3.2.8 + 3.2.9 test From ac5f7632e3d3ccc12f62850d968eed34cabe2f18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 29 Oct 2018 13:21:02 +0000 Subject: [PATCH 139/548] Bump joda-time from 2.10 to 2.10.1 Bumps [joda-time](https://github.com/JodaOrg/joda-time) from 2.10 to 2.10.1. - [Release notes](https://github.com/JodaOrg/joda-time/releases) - [Changelog](https://github.com/JodaOrg/joda-time/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/JodaOrg/joda-time/compare/v2.10...v2.10.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e74376a73..f3ebe12a7 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,7 @@ joda-time joda-time - 2.10 + 2.10.1 From a64e6790a4e7d04a281cf11ada1c4ddf22830ce0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 29 Oct 2018 13:21:15 +0000 Subject: [PATCH 140/548] Bump json-unit.version from 1.31.1 to 2.0.1 Bumps `json-unit.version` from 1.31.1 to 2.0.1. Updates `json-unit` from 1.31.1 to 2.0.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-1.31.1...json-unit-parent-2.0.1) Updates `json-unit-core` from 1.31.1 to 2.0.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-1.31.1...json-unit-parent-2.0.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e74376a73..6ac397b6f 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 1.31.1 + 2.0.1 2.22.1 2.22.1 From 780706ec42136a1431dac2f4b1c2b5916c5e2f44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 30 Oct 2018 13:21:37 +0000 Subject: [PATCH 141/548] Bump equalsverifier from 3.0 to 3.0.1 Bumps [equalsverifier](https://github.com/jqno/equalsverifier) from 3.0 to 3.0.1. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-3.0...equalsverifier-3.0.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e74376a73..8f14788c6 100644 --- a/pom.xml +++ b/pom.xml @@ -412,7 +412,7 @@ nl.jqno.equalsverifier equalsverifier - 3.0 + 3.0.1 test From e4f9ba4ae8c749007adde2870cb74d341ad62233 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 31 Oct 2018 13:18:52 +0000 Subject: [PATCH 142/548] Bump json-unit.version from 2.0.1 to 2.0.2 Bumps `json-unit.version` from 2.0.1 to 2.0.2. Updates `json-unit` from 2.0.1 to 2.0.2 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.0.1...json-unit-parent-2.0.2) Updates `json-unit-core` from 2.0.1 to 2.0.2 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.0.1...json-unit-parent-2.0.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 02c7fd3b5..07a425991 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 2.0.1 + 2.0.2 2.22.1 2.22.1 From 116d7f2392cbbf6ad12edef5f526ef94c9ab1836 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 1 Nov 2018 13:17:22 +0000 Subject: [PATCH 143/548] Bump equalsverifier from 3.0.1 to 3.0.2 Bumps [equalsverifier](https://github.com/jqno/equalsverifier) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-3.0.1...equalsverifier-3.0.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 02c7fd3b5..4c4de609e 100644 --- a/pom.xml +++ b/pom.xml @@ -412,7 +412,7 @@ nl.jqno.equalsverifier equalsverifier - 3.0.1 + 3.0.2 test From fdece7a7bef8dd95160fbed112154a8b37ac6827 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 6 Nov 2018 13:20:24 +0000 Subject: [PATCH 144/548] Bump json-unit.version from 2.0.2 to 2.0.3 Bumps `json-unit.version` from 2.0.2 to 2.0.3. Updates `json-unit` from 2.0.2 to 2.0.3 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.0.2...json-unit-parent-2.0.3) Updates `json-unit-core` from 2.0.2 to 2.0.3 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.0.2...json-unit-parent-2.0.3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4fb82218c..16b1c7c57 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 2.0.2 + 2.0.3 2.22.1 2.22.1 From da5a8fb8fef9e6cc88cf9031de86395cb43e9c3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 19 Nov 2018 13:25:39 +0000 Subject: [PATCH 145/548] Bump equalsverifier from 3.0.2 to 3.0.3 Bumps [equalsverifier](https://github.com/jqno/equalsverifier) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Changelog](https://github.com/jqno/equalsverifier/blob/master/CHANGELOG.md) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-3.0.2...equalsverifier-3.0.3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 16b1c7c57..f7ea40ae5 100644 --- a/pom.xml +++ b/pom.xml @@ -412,7 +412,7 @@ nl.jqno.equalsverifier equalsverifier - 3.0.2 + 3.0.3 test From c1d268461bb1589d946d70bc6a52ef227d60451e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 21 Nov 2018 13:20:24 +0000 Subject: [PATCH 146/548] Bump json-unit.version from 2.0.3 to 2.1.1 Bumps `json-unit.version` from 2.0.3 to 2.1.1. Updates `json-unit` from 2.0.3 to 2.1.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.0.3...json-unit-parent-2.1.1) Updates `json-unit-core` from 2.0.3 to 2.1.1 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.0.3...json-unit-parent-2.1.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f7ea40ae5..c3b26de7a 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 2.0.3 + 2.1.1 2.22.1 2.22.1 From 4c894a2c1843afde015be60fdbaaa0aa48cc8f5c Mon Sep 17 00:00:00 2001 From: Dominik Labuda Date: Mon, 26 Nov 2018 13:39:44 +0100 Subject: [PATCH 147/548] Simplified VisualizationConverter methods for Execution conversion We wanted to convert objects of VisualizationObject and VisualizationClass that we obtained beforehand, but we were forced to write some boilerplate function that returned the VisualizationClass instead of providing the VisualizationClass directly. The modified methods simply allow to provide the VisualizationClass directly, while still keeping the backward compatibility with previous approach. In addition, new check was implemented that checks whether the VisualizationClass URI matches with the URI that VisualizationObject contains. If you try to create convert incompatible objects, exception will be thrown. --- .../visualization/VisualizationConverter.java | 57 ++++++++++++++----- .../md/visualization/VisualizationObject.java | 16 ++++++ .../VisualizationConverterTest.groovy | 25 +++++++- 3 files changed, 82 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java index ed0756b8e..48b2973c0 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java @@ -5,6 +5,14 @@ */ package com.gooddata.md.visualization; +import static com.gooddata.executeafm.resultspec.Dimension.MEASURE_GROUP; +import static com.gooddata.md.visualization.CollectionType.SEGMENT; +import static com.gooddata.md.visualization.CollectionType.STACK; +import static com.gooddata.md.visualization.CollectionType.TREND; +import static com.gooddata.md.visualization.CollectionType.VIEW; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.Validate.notNull; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -21,20 +29,12 @@ import com.gooddata.executeafm.resultspec.Dimension; import com.gooddata.executeafm.resultspec.ResultSpec; import com.gooddata.executeafm.resultspec.SortItem; - +import com.gooddata.util.Validate; import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; -import static com.gooddata.executeafm.resultspec.Dimension.MEASURE_GROUP; -import static com.gooddata.md.visualization.CollectionType.SEGMENT; -import static com.gooddata.md.visualization.CollectionType.STACK; -import static com.gooddata.md.visualization.CollectionType.TREND; -import static com.gooddata.md.visualization.CollectionType.VIEW; -import static java.util.stream.Collectors.toList; -import static org.apache.commons.lang3.Validate.notNull; - /** * Helper class for converting {@link VisualizationObject} into {@link Execution} */ @@ -47,12 +47,26 @@ public abstract class VisualizationConverter { * @param visualizationObject which will be converted to {@link Execution} * @param visualizationClassGetter {@link Function} for fetching VisualizationClass, which is necessary for correct generation of {@link ResultSpec} * @return {@link Execution} object + * @see #convertToExecution(VisualizationObject, VisualizationClass) + */ + public static Execution convertToExecution(final VisualizationObject visualizationObject, + final Function visualizationClassGetter) { + return convertToExecution(visualizationObject, + notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri())); + } + + /** + * Generate Execution from Visualization object. * + * @param visualizationObject which will be converted to {@link Execution} + * @param visualizationClass visualizationClass, which is necessary for correct generation of {@link ResultSpec} + * @return {@link Execution} object * @see #convertToAfm(VisualizationObject) - * @see #convertToResultSpec(VisualizationObject, Function) + * @see #convertToResultSpec(VisualizationObject, VisualizationClass) */ - public static Execution convertToExecution(final VisualizationObject visualizationObject, final Function visualizationClassGetter) { - ResultSpec resultSpec = convertToResultSpec(visualizationObject, visualizationClassGetter); + public static Execution convertToExecution(final VisualizationObject visualizationObject, + final VisualizationClass visualizationClass) { + ResultSpec resultSpec = convertToResultSpec(visualizationObject, visualizationClass); Afm afm = convertToAfm(visualizationObject); return new Execution(afm, resultSpec); } @@ -80,9 +94,24 @@ public static Afm convertToAfm(final VisualizationObject visualizationObject) { * @return {@link Execution} object */ public static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, - final Function visualizationClassGetter) { - VisualizationClass visualizationClass = notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri()); + final Function visualizationClassGetter) { + return convertToResultSpec(visualizationObject, + notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri())); + } + /** + * Generate ResultSpec from Visualization object. Currently {@link ResultSpec}'s {@link Dimension}s can be generated + * for table and four types of chart: bar, column, line and pie. + * + * @param visualizationObject which will be converted to {@link Execution} + * @param visualizationClass VisualizationClass, which is necessary for correct generation of {@link ResultSpec} + * @return {@link Execution} object + */ + public static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, + final VisualizationClass visualizationClass) { + Validate.isTrue(visualizationObject.getVisualizationClassUri().equals(visualizationClass.getUri()), + "visualizationClass URI does not match the URI within visualizationObject, " + + "you're trying to create ResultSpec for incompatible objects"); List sorts = getSorting(visualizationObject); List dimensions = getDimensions(visualizationObject, visualizationClass.getVisualizationType()); return new ResultSpec(dimensions, sorts); diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java index 6d5de4f70..f07517a63 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationObject.java @@ -287,6 +287,14 @@ public Execution convertToExecution(Function visuali return VisualizationConverter.convertToExecution(this, visualizationClassgetter); } + /** + * @see VisualizationConverter#convertToExecution(VisualizationObject, VisualizationClass) + */ + @JsonIgnore + public Execution convertToExecution(VisualizationClass visualizationClass) { + return VisualizationConverter.convertToExecution(this, visualizationClass); + } + /** * @see VisualizationConverter#convertToAfm(VisualizationObject) */ @@ -303,6 +311,14 @@ public ResultSpec convertToResultSpec(Function visua return VisualizationConverter.convertToResultSpec(this, visualizationClassgetter); } + /** + * @see VisualizationConverter#convertToResultSpec(VisualizationObject, VisualizationClass) + */ + @JsonIgnore + public ResultSpec convertToResultSpec(VisualizationClass visualizationClass) { + return VisualizationConverter.convertToResultSpec(this, visualizationClass); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content implements Serializable { diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy index 66dbd5df6..270623bc2 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy @@ -85,8 +85,13 @@ class VisualizationConverterTest extends Specification { @Unroll def "should generate result spec for table with default sorting from #name"() { given: - Function getter = { vizObject -> Stub(VisualizationClass) { getVisualizationType() >> VisualizationType.TABLE } } VisualizationObject vo = readObjectFromResource("/$resource", VisualizationObject) + Function getter = { vizObject -> + Stub(VisualizationClass) { + getVisualizationType() >> VisualizationType.TABLE + getUri() >> vo.getVisualizationClassUri() + } + } ResultSpec converted = convertToResultSpec(vo, getter) expect: @@ -107,8 +112,13 @@ class VisualizationConverterTest extends Specification { @Unroll def "should generate result spec for #type"() { given: - Function getter = { vizObject -> Stub(VisualizationClass) { getVisualizationType() >> VisualizationType.of(type) } } VisualizationObject vo = readObjectFromResource("/$resource", VisualizationObject) + Function getter = { vizObject -> + Stub(VisualizationClass) { + getVisualizationType() >> VisualizationType.of(type) + getUri() >> vo.getVisualizationClassUri() + } + } ResultSpec converted = convertToResultSpec(vo, getter) expect: @@ -160,4 +170,15 @@ class VisualizationConverterTest extends Specification { where: properties << ['abcd', '{"sortItems":[{"someinvalidstring"}]}'] } + + def "should fail when incorrect visualization class is provided"() { + when: + convertToResultSpec( + Stub(VisualizationObject) { getVisualizationClassUri() >> 'visClassUri'}, + Stub(VisualizationClass) { getUri() >> 'nonMatchingVisClassUri'} + ) + + then: + thrown(IllegalArgumentException) + } } From 4c99c64e233e40c55b8b5a0b28d48c6a7a0d33d3 Mon Sep 17 00:00:00 2001 From: Dominik Labuda Date: Tue, 27 Nov 2018 10:33:33 +0100 Subject: [PATCH 148/548] Added notNull validations to public VisualizationConverter methods --- .../visualization/VisualizationConverter.java | 20 +++++-- .../VisualizationConverterTest.groovy | 53 +++++++++++++++++++ 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java index 48b2973c0..d8df11f9e 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java +++ b/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java @@ -10,8 +10,10 @@ import static com.gooddata.md.visualization.CollectionType.STACK; import static com.gooddata.md.visualization.CollectionType.TREND; import static com.gooddata.md.visualization.CollectionType.VIEW; +import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.isTrue; import static java.util.stream.Collectors.toList; -import static org.apache.commons.lang3.Validate.notNull; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; @@ -29,7 +31,6 @@ import com.gooddata.executeafm.resultspec.Dimension; import com.gooddata.executeafm.resultspec.ResultSpec; import com.gooddata.executeafm.resultspec.SortItem; -import com.gooddata.util.Validate; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -51,8 +52,10 @@ public abstract class VisualizationConverter { */ public static Execution convertToExecution(final VisualizationObject visualizationObject, final Function visualizationClassGetter) { + notNull(visualizationObject, "visualizationObject"); + notNull(visualizationClassGetter, "visualizationClassGetter"); return convertToExecution(visualizationObject, - notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri())); + visualizationClassGetter.apply(visualizationObject.getVisualizationClassUri())); } /** @@ -66,6 +69,8 @@ public static Execution convertToExecution(final VisualizationObject visualizati */ public static Execution convertToExecution(final VisualizationObject visualizationObject, final VisualizationClass visualizationClass) { + notNull(visualizationObject, "visualizationObject"); + notNull(visualizationClass, "visualizationClass"); ResultSpec resultSpec = convertToResultSpec(visualizationObject, visualizationClass); Afm afm = convertToAfm(visualizationObject); return new Execution(afm, resultSpec); @@ -78,6 +83,7 @@ public static Execution convertToExecution(final VisualizationObject visualizati * @return {@link Afm} object */ public static Afm convertToAfm(final VisualizationObject visualizationObject) { + notNull(visualizationObject, "visualizationObject"); final List attributes = convertAttributes(visualizationObject.getAttributes()); final List filters = convertFilters(visualizationObject.getFilters()); final List measures = convertMeasures(visualizationObject.getMeasures()); @@ -95,8 +101,10 @@ public static Afm convertToAfm(final VisualizationObject visualizationObject) { */ public static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, final Function visualizationClassGetter) { + notNull(visualizationObject, "visualizationObject"); + notNull(visualizationClassGetter, "visualizationClassGetter"); return convertToResultSpec(visualizationObject, - notNull(visualizationClassGetter).apply(notNull(visualizationObject).getVisualizationClassUri())); + visualizationClassGetter.apply(visualizationObject.getVisualizationClassUri())); } /** @@ -109,7 +117,9 @@ public static ResultSpec convertToResultSpec(final VisualizationObject visualiza */ public static ResultSpec convertToResultSpec(final VisualizationObject visualizationObject, final VisualizationClass visualizationClass) { - Validate.isTrue(visualizationObject.getVisualizationClassUri().equals(visualizationClass.getUri()), + notNull(visualizationObject, "visualizationObject"); + notNull(visualizationClass, "visualizationClass"); + isTrue(visualizationObject.getVisualizationClassUri().equals(visualizationClass.getUri()), "visualizationClass URI does not match the URI within visualizationObject, " + "you're trying to create ResultSpec for incompatible objects"); List sorts = getSorting(visualizationObject); diff --git a/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy b/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy index 270623bc2..006d64d58 100644 --- a/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy +++ b/src/test/groovy/com/gooddata/md/visualization/VisualizationConverterTest.groovy @@ -29,6 +29,7 @@ import java.util.function.Function import static VisualizationConverter.convertToAfm import static VisualizationConverter.convertToResultSpec import static VisualizationConverter.parseSorting +import static com.gooddata.md.visualization.VisualizationConverter.convertToExecution import static com.gooddata.util.ResourceUtils.readObjectFromResource import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals import static spock.util.matcher.HamcrestSupport.that @@ -181,4 +182,56 @@ class VisualizationConverterTest extends Specification { then: thrown(IllegalArgumentException) } + + @Unroll + def "should fail if any argument is null in convertToResultSpec(VisualizationObject, VisualizationClass)"() { + when: + convertToResultSpec(vo, vc) + + then: + thrown(IllegalArgumentException) + + where: + vo << [null, Stub(VisualizationObject), null] + vc << [null, null, Stub(VisualizationClass)] + } + + @Unroll + def "should fail if any argument is null in convertToResultSpec(VisualizationObject, Function)"() { + when: + convertToResultSpec(vo, vcg) + + then: + thrown(IllegalArgumentException) + + where: + vo << [null, Stub(VisualizationObject), null] + vcg << [null, null, Stub(Function)] + } + + @Unroll + def "should fail if any argument is null in convertToExecution(VisualizationObject, VisualizationClass)"() { + when: + convertToExecution(vo, vc) + + then: + thrown(IllegalArgumentException) + + where: + vo << [null, Stub(VisualizationObject), null] + vc << [null, null, Stub(VisualizationClass)] + } + + @Unroll + def "should fail if any argument is null in convertToExecution(VisualizationObject, Function)"() { + when: + convertToExecution(vo, vcg) + + then: + thrown(IllegalArgumentException) + + where: + vo << [null, Stub(VisualizationObject), null] + vcg << [null, null, Stub(Function)] + } } From 6c37586937a6d90d12e2bc0ffe3cc0081a37d95b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 10 Dec 2018 13:15:19 +0000 Subject: [PATCH 149/548] Bump json-unit.version from 2.1.1 to 2.2.0 Bumps `json-unit.version` from 2.1.1 to 2.2.0. Updates `json-unit` from 2.1.1 to 2.2.0 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.1.1...json-unit-parent-2.2.0) Updates `json-unit-core` from 2.1.1 to 2.2.0 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.1.1...json-unit-parent-2.2.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c3b26de7a..db842a379 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 2.8.11.2 4.3.18.RELEASE 1.3.0 - 2.1.1 + 2.2.0 2.22.1 2.22.1 From 7e4a1535509fe8795d58466724b7132d2631d82e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 12 Dec 2018 19:05:24 +0000 Subject: [PATCH 150/548] Bump cglib-nodep from 3.2.9 to 3.2.10 Bumps [cglib-nodep](https://github.com/cglib/cglib) from 3.2.9 to 3.2.10. - [Release notes](https://github.com/cglib/cglib/releases) - [Commits](https://github.com/cglib/cglib/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index db842a379..365e702aa 100644 --- a/pom.xml +++ b/pom.xml @@ -430,7 +430,7 @@ cglib cglib-nodep - 3.2.9 + 3.2.10 test From c913a4b5edcee2a07ea8c1bea47bc75893a866b7 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 13 Dec 2018 11:30:23 +0100 Subject: [PATCH 151/548] Remove deprecated part from Travis config https://docs.travis-ci.com/user/reference/trusty/ says: Container-based infrastructure is currently being deprecated. Please remove any `sudo:` false keys in your `.travis.yml` file to use the default fully-virtualized Linux infrastructure instead. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ac904f8d3..a6d25f65f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ branches: only: - master - /\d\.0\.0-RC/ -sudo: false cache: directories: - '$HOME/.m2/repository' From 0337f6e51ff011db3ee5b47f583e8808a1d85ce5 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 13 Dec 2018 11:46:45 +0100 Subject: [PATCH 152/548] Shorten mvn console output in Travis Add `-B` (non-interactive/batch mode) to hide download progress indication. --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a6d25f65f..994f14fb7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,15 @@ language: java +# Skip the Travis Installation Phase (installation of dependencies: `mvn install -DskipTests=true`) install: true -script: mvn verify javadoc:javadoc coveralls:report -Pcoverage +# Customized build command (default is only `mvn test`) +script: mvn verify javadoc:javadoc coveralls:report -Pcoverage -B -V jdk: - oraclejdk8 branches: only: - master - /\d\.0\.0-RC/ +# Cache Maven repo between Travis builds cache: directories: - '$HOME/.m2/repository' From 94015beb81279910e91dcb65d9733141e21a75de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 13 Dec 2018 13:23:42 +0000 Subject: [PATCH 153/548] Bump groovy-all from 2.4.15 to 2.4.16 Bumps [groovy-all](https://github.com/apache/groovy) from 2.4.15 to 2.4.16. - [Release notes](https://github.com/apache/groovy/releases) - [Commits](https://github.com/apache/groovy/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 365e702aa..c6bb78281 100644 --- a/pom.xml +++ b/pom.xml @@ -424,7 +424,7 @@ org.codehaus.groovy groovy-all - 2.4.15 + 2.4.16 test From 73fccf69913a2ab9f08d311aa484bc71eb585741 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 14 Dec 2018 14:16:35 +0100 Subject: [PATCH 154/548] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d3bf102b..8090c846f 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.30.0 + 2.31.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From db1beebe9a6f558b0f138bbdeed417a72ff72098 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 14 Dec 2018 14:19:35 +0100 Subject: [PATCH 155/548] [maven-release-plugin] prepare release gooddata-java-2.31.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c6bb78281..b14c0be59 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.30.1-SNAPSHOT + 2.31.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.31.0 From c2da5e738418bfa057002681fe8b4bfc40e05d7d Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 14 Dec 2018 14:19:36 +0100 Subject: [PATCH 156/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b14c0be59..c321ec0f8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.31.0 + 2.31.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.31.0 + HEAD From 44a967eca84c776eba0e28ac24aaa1f579d073bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 17 Dec 2018 08:13:33 +0100 Subject: [PATCH 157/548] Remove old style versioning support --- src/main/java/com/gooddata/GoodData.java | 17 +++-------------- src/test/java/com/gooddata/GoodDataIT.java | 13 +------------ 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 5f3bb48cc..7bf36eefc 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -40,9 +40,8 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; -import java.util.Arrays; - import static com.gooddata.util.Validate.notNull; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.apache.http.util.VersionInfo.loadVersionInfo; @@ -72,8 +71,6 @@ public class GoodData { protected static final String HOSTNAME = GoodDataEndpoint.HOSTNAME; private static final String UNKNOWN_VERSION = "UNKNOWN"; - private static final int RESTAPI_VERSION = 1; - private final RestTemplate restTemplate; private final HttpClient httpClient; private final AccountService accountService; @@ -246,8 +243,8 @@ static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient htt endpoint.toUri() ); final RestTemplate restTemplate = new RestTemplate(factory); - restTemplate.setInterceptors(Arrays.asList( - new HeaderSettingRequestInterceptor(singletonMap("Accept", getAcceptHeaderValue())))); + restTemplate.setInterceptors(singletonList( + new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); @@ -274,14 +271,6 @@ private HttpClientBuilder createHttpClientBuilder(final GoodDataSettings setting .setDefaultRequestConfig(requestConfig.build()); } - /* - * Set accept header (application/json by default) and append rest api versioning information which is mandatory - * for some resources. - */ - private static String getAcceptHeaderValue(){ - return MediaType.APPLICATION_JSON_VALUE + ";version=" + RESTAPI_VERSION; - } - private String getUserAgent() { final Package pkg = Package.getPackage("com.gooddata"); final String clientVersion = pkg != null && pkg.getImplementationVersion() != null diff --git a/src/test/java/com/gooddata/GoodDataIT.java b/src/test/java/com/gooddata/GoodDataIT.java index 8b4b9e3ed..ccf1dc385 100644 --- a/src/test/java/com/gooddata/GoodDataIT.java +++ b/src/test/java/com/gooddata/GoodDataIT.java @@ -25,18 +25,7 @@ protected GoodDataSettings createGoodDataSettings() { } @Test - public void rootLinksShouldUseProperVersionHeader() throws Exception { - onRequest() - .havingMethodEqualTo("GET") - .havingHeaderEqualTo("Accept", "application/json;version=1") - .respond() - .withStatus(200); - - gd.getGdcService().getRootLinks(); - } - - @Test - public void shouldSentCustomUserAgentHeader() throws Exception { + public void shouldSentCustomUserAgentHeader() { onRequest() .havingMethodEqualTo("GET") .respond() From 3f932672ef9c88e19930f681a8420deec7c45102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 17 Dec 2018 10:20:03 +0100 Subject: [PATCH 158/548] Replace deprecated jadler calls with current alternatives --- src/test/groovy/com/gooddata/GoodDataITBase.groovy | 2 +- src/test/java/com/gooddata/AbstractGoodDataIT.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/groovy/com/gooddata/GoodDataITBase.groovy b/src/test/groovy/com/gooddata/GoodDataITBase.groovy index 4eaa18f8a..cb420db66 100644 --- a/src/test/groovy/com/gooddata/GoodDataITBase.groovy +++ b/src/test/groovy/com/gooddata/GoodDataITBase.groovy @@ -18,7 +18,7 @@ abstract class GoodDataITBase extends Specification { protected GoodData gd void setup() { - initJadler().that().respondsWithDefaultContentType('application/json') + initJadler().withDefaultResponseContentType('application/json') gd = new GoodData( new GoodDataEndpoint('localhost', port(), 'http'), new LoginPasswordAuthentication('sdk@gooddata.com', 'sdk'), diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index e408a3ef1..1d9ca84d0 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -19,7 +19,7 @@ public abstract class AbstractGoodDataIT { @BeforeMethod public void commonSetUp() { - initJadler().that().respondsWithDefaultContentType("application/json"); + initJadler().withDefaultResponseContentType("application/json"); gd = new GoodData( new GoodDataEndpoint("localhost", port(), "http"), new LoginPasswordAuthentication("sdk@gooddata.com", "sdk"), From cd3580056b689b765b1022a349d7c81f84e76044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 17 Dec 2018 10:32:15 +0100 Subject: [PATCH 159/548] Introduce support for X-GDC-Version header --- README.md | 3 + pom.xml | 2 +- release.sh | 26 ++++---- src/main/java/com/gooddata/GoodData.java | 23 ++++++- src/main/resources/GoodDataApiVersion | 1 + .../groovy/com/gooddata/GoodDataIT.groovy | 66 +++++++++++++++++++ src/test/java/com/gooddata/GoodDataIT.java | 40 ----------- 7 files changed, 106 insertions(+), 55 deletions(-) create mode 100644 src/main/resources/GoodDataApiVersion create mode 100644 src/test/groovy/com/gooddata/GoodDataIT.groovy delete mode 100644 src/test/java/com/gooddata/GoodDataIT.java diff --git a/README.md b/README.md index 8090c846f..0aad29350 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ or [Wiki](https://github.com/gooddata/gooddata-java/wiki) for [Code Examples](https://github.com/gooddata/gooddata-java/wiki/Code-Examples) and [Extensibility How-To](https://github.com/gooddata/gooddata-java/wiki/Extending). +### API version +Since *GoodData Java SDK* version *2.32.0* API versioning is supported. The API version, GoodData Java is compatible with, is marked in artifact version using `+api` suffix (i.e. `2.32.0+api1` is compatible with API version `1`). + ### Dependencies The *GoodData Java SDK* uses: diff --git a/pom.xml b/pom.xml index c321ec0f8..eb273806c 100644 --- a/pom.xml +++ b/pom.xml @@ -258,7 +258,7 @@ com.gooddata gooddata-rest-common - 1.2.2 + 1.3.0 com.gooddata diff --git a/release.sh b/release.sh index 58ef61f1a..9e025bebd 100755 --- a/release.sh +++ b/release.sh @@ -10,10 +10,10 @@ while getopts ":hv:g:" opt do case ${opt} in v) - version=${OPTARG} + VERSION=${OPTARG} ;; g) - gpg_pass=${OPTARG} + GPG_PASS=${OPTARG} ;; h) usage @@ -41,18 +41,18 @@ then exit 1 fi -if [ -z "${version}" ] +if [ -z "${VERSION}" ] then echo "No version given!" usage exit 1 fi -if [ -z "${gpg_pass}" ] +if [ -z "${GPG_PASS}" ] then echo "Enter gpg password: " - read -s gpg_pass - if [ -z "${gpg_pass}" ] + read -s GPG_PASS + if [ -z "${GPG_PASS}" ] then echo "No gpg password given!" usage @@ -60,16 +60,20 @@ then fi fi -sed -i.bak "s/\(\)[0-9]*\.[0-9]*\.[0-9]*\(<\/version>\)/\1${version}\2/" README.md && rm -f README.md.bak +API_VERSION=$(cat src/main/resources/GoodDataApiVersion) +FULL_VERSION=$VERSION+api$API_VERSION +DEV_VERSION=$(echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g')-SNAPSHOT + +sed -i.bak "s/\(\)[0-9]*\.[0-9]*\.[0-9]*[^<]*\(<\/version>\)/\1${FULL_VERSION}\2/" README.md && rm -f README.md.bak git commit -a -m "bump version" -mvn --batch-mode release:prepare release:perform -DreleaseVersion=${version} -Darguments="-Dgpg.passphrase=${gpg_pass}" -mvnRetVal=$? -if [ $mvnRetVal -ne 0 ]; then +mvn --batch-mode release:prepare release:perform -DreleaseVersion=${FULL_VERSION} -DdevelopmentVersion=${DEV_VERSION} -Darguments="-Dgpg.passphrase=${GPG_PASS}" +MVN_RET_VAL=$? +if [ $MVN_RET_VAL -ne 0 ]; then echo "Mvn build failed - please fix it and try to release again" echo "Removing last commit '$(git log -1 --pretty="%h %s")'" git reset --hard HEAD~1 - exit $mvnRetVal + exit $MVN_RET_VAL fi git push origin --tags HEAD diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 7bf36eefc..03fff7139 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -38,11 +38,16 @@ import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.util.StreamUtils; import org.springframework.web.client.RestTemplate; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + import static com.gooddata.util.Validate.notNull; import static java.util.Collections.singletonList; -import static java.util.Collections.singletonMap; import static org.apache.http.util.VersionInfo.loadVersionInfo; /** @@ -242,9 +247,13 @@ static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient htt new HttpComponentsClientHttpRequestFactory(httpClient), endpoint.toUri() ); + + final Map presetHeaders = new HashMap<>(2); + presetHeaders.put("Accept", MediaType.APPLICATION_JSON_VALUE); + presetHeaders.put(Header.GDC_VERSION, readApiVersion()); + final RestTemplate restTemplate = new RestTemplate(factory); - restTemplate.setInterceptors(singletonList( - new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); + restTemplate.setInterceptors(singletonList(new HeaderSettingRequestInterceptor(presetHeaders))); restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); @@ -284,6 +293,14 @@ private String getUserAgent() { "Apache-HttpClient", apacheVersion); } + private static String readApiVersion() { + try { + return StreamUtils.copyToString(GoodData.class.getResourceAsStream("/GoodDataApiVersion"), Charset.defaultCharset()); + } catch (IOException e) { + throw new IllegalStateException("Cannot read GoodDataApiVersion from classpath", e); + } + } + /** * Get the configured {@link RestTemplate} used by the library. * This is the extension point for inheriting classes providing additional services. diff --git a/src/main/resources/GoodDataApiVersion b/src/main/resources/GoodDataApiVersion new file mode 100644 index 000000000..56a6051ca --- /dev/null +++ b/src/main/resources/GoodDataApiVersion @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/src/test/groovy/com/gooddata/GoodDataIT.groovy b/src/test/groovy/com/gooddata/GoodDataIT.groovy new file mode 100644 index 000000000..1f9272669 --- /dev/null +++ b/src/test/groovy/com/gooddata/GoodDataIT.groovy @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata + +import com.gooddata.gdc.GdcService +import com.gooddata.gdc.Header +import org.apache.http.HttpHeaders + +import static net.jadler.Jadler.onRequest +import static net.jadler.Jadler.verifyThatRequest +import static org.hamcrest.CoreMatchers.equalTo +import static org.hamcrest.CoreMatchers.hasItem +import static org.hamcrest.CoreMatchers.startsWith + +class GoodDataIT extends GoodDataITBase { + + private static final String USER_AGENT = 'customAgent/X.Y' + private static final String API_VERSION = '1' + + @Override + protected GoodDataSettings createGoodDataSettings() { + final GoodDataSettings settings = super.createGoodDataSettings() + settings.setUserAgent(USER_AGENT) + return settings + } + + @Override + protected GdcService getService() { + return gd.gdcService + } + + def "should send custom userAgent header"() { + given: + onRequest() + .havingMethodEqualTo("GET") + .respond() + .withStatus(200) + + when: + service.getRootLinks() + + then: + verifyThatRequest() + .havingHeader(HttpHeaders.USER_AGENT, hasItem(startsWith("$USER_AGENT GoodData-Java-SDK"))) + .receivedOnce() + } + + def "should send API version header"() { + given: + onRequest() + .havingMethodEqualTo("GET") + .respond() + .withStatus(200) + + when: + service.getRootLinks() + + then: + verifyThatRequest() + .havingHeader(Header.GDC_VERSION, hasItem(equalTo(API_VERSION))) + .receivedOnce() + } +} diff --git a/src/test/java/com/gooddata/GoodDataIT.java b/src/test/java/com/gooddata/GoodDataIT.java deleted file mode 100644 index ccf1dc385..000000000 --- a/src/test/java/com/gooddata/GoodDataIT.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. - * This source code is licensed under the BSD-style license found in the - * LICENSE.txt file in the root directory of this source tree. - */ -package com.gooddata; - -import org.apache.http.HttpHeaders; -import org.testng.annotations.Test; - -import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.verifyThatRequest; -import static org.hamcrest.CoreMatchers.hasItem; -import static org.hamcrest.CoreMatchers.startsWith; - -public class GoodDataIT extends AbstractGoodDataIT { - - private static final String USER_AGENT = "customAgent/X.Y"; - - @Override - protected GoodDataSettings createGoodDataSettings() { - final GoodDataSettings settings = super.createGoodDataSettings(); - settings.setUserAgent(USER_AGENT); - return settings; - } - - @Test - public void shouldSentCustomUserAgentHeader() { - onRequest() - .havingMethodEqualTo("GET") - .respond() - .withStatus(200); - - gd.getGdcService().getRootLinks(); - - verifyThatRequest() - .havingHeader(HttpHeaders.USER_AGENT, hasItem(startsWith(USER_AGENT + " GoodData-Java-SDK"))) - .receivedOnce(); - } -} From 6a955c82f4e37e8014e07caf86794377c6640adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Wed, 19 Dec 2018 07:36:10 +0100 Subject: [PATCH 160/548] Raise pom to 3.0.0-RC.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 77a5638cd..0ac1e6c44 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.29.1-SNAPSHOT + 3.0.0-RC.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 3fea70f2a15e1f6716765d10ae8d2c5ca1164a26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 1 Jan 2019 13:19:24 +0000 Subject: [PATCH 161/548] Bump equalsverifier from 3.0.3 to 3.1.4 Bumps [equalsverifier](https://github.com/jqno/equalsverifier) from 3.0.3 to 3.1.4. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Changelog](https://github.com/jqno/equalsverifier/blob/master/CHANGELOG.md) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-3.0.3...equalsverifier-3.1.4) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c321ec0f8..53f60a1e7 100644 --- a/pom.xml +++ b/pom.xml @@ -412,7 +412,7 @@ nl.jqno.equalsverifier equalsverifier - 3.0.3 + 3.1.4 test From ffd44a6283e509dadda54df133b77fdd641c71d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Mon, 17 Dec 2018 13:23:38 +0100 Subject: [PATCH 162/548] Introduce support for X-GDC-DEPRECATED header --- README.md | 14 +++++++ pom.xml | 12 ++++++ .../DeprecationWarningRequestInterceptor.java | 40 +++++++++++++++++++ src/main/java/com/gooddata/GoodData.java | 5 ++- 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/DeprecationWarningRequestInterceptor.java diff --git a/README.md b/README.md index 0aad29350..28295f87c 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,22 @@ The *GoodData Java SDK* uses: * the *Apache HTTP Client* version 4.5 or later (for white-labeled domains at least version 4.3.2 is required) * the *Spring Framework* version 4.3.* * the *Jackson JSON Processor* version 2.8.* +* the *Slf4j API* version 1.7.* * the *Java Development Kit (JDK)* version 8 or later +### Logging + +The *GoodData Java SDK* logs using `slf4j-api`. Please adjust your logging configuration for +`com.gooddata.sdk.*` loggers or alternatively turn the logging off using following dependency: + +```xml + + org.slf4j + slf4j-nop + 1.7.25 + +``` + ## Development Build the library with `mvn package`, see the diff --git a/pom.xml b/pom.xml index eb273806c..63beada30 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,7 @@ 4.4.10 2.8.11 2.8.11.2 + 1.7.25 4.3.18.RELEASE 1.3.0 2.2.0 @@ -336,6 +337,11 @@ joda-time 2.10.1 + + org.slf4j + slf4j-api + ${slf4j.version} + commons-io @@ -385,6 +391,12 @@ ${json-unit.version} test + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + test + log4j log4j diff --git a/src/main/java/com/gooddata/DeprecationWarningRequestInterceptor.java b/src/main/java/com/gooddata/DeprecationWarningRequestInterceptor.java new file mode 100644 index 000000000..fae7bb99b --- /dev/null +++ b/src/main/java/com/gooddata/DeprecationWarningRequestInterceptor.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata; + +import com.gooddata.gdc.Header; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; +import java.util.List; + +/** + * Intercepts the request-response to check for X-GDC-DEPRECATED header and log it's content. + */ +class DeprecationWarningRequestInterceptor implements ClientHttpRequestInterceptor { + + private static final Logger logger = LoggerFactory.getLogger("com.gooddata.sdk.DeprecationWarning"); + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, + ClientHttpRequestExecution execution) throws IOException { + final ClientHttpResponse response = execution.execute(request, body); + if (logger.isWarnEnabled()) { + final List deprecated = response.getHeaders().get(Header.GDC_DEPRECATED); + if (deprecated != null && !deprecated.isEmpty()) { + final List versionHeaders = request.getHeaders().get(Header.GDC_VERSION); + final String version = versionHeaders != null && !versionHeaders.isEmpty() ? versionHeaders.get(0) : "UNKNOWN"; + logger.warn("Resource path={} version={} deprecated {}", request.getURI().getPath(), version, deprecated.get(0)); + } + } + return response; + } +} diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 03fff7139..82eaba374 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -47,6 +47,7 @@ import java.util.Map; import static com.gooddata.util.Validate.notNull; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.apache.http.util.VersionInfo.loadVersionInfo; @@ -253,7 +254,9 @@ static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient htt presetHeaders.put(Header.GDC_VERSION, readApiVersion()); final RestTemplate restTemplate = new RestTemplate(factory); - restTemplate.setInterceptors(singletonList(new HeaderSettingRequestInterceptor(presetHeaders))); + restTemplate.setInterceptors(asList( + new HeaderSettingRequestInterceptor(presetHeaders), + new DeprecationWarningRequestInterceptor())); restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); From 6c204f13d380302fd32dd093b63859cfb5f613c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 21 Dec 2018 13:17:10 +0000 Subject: [PATCH 163/548] Bump hamcrest from 1.3 to 2.1 Bumps [hamcrest-library](https://github.com/hamcrest/JavaHamcrest) from 1.3 to 2.1. - [Release notes](https://github.com/hamcrest/JavaHamcrest/releases) - [Changelog](https://github.com/hamcrest/JavaHamcrest/blob/master/CHANGES.md) - [Commits](https://github.com/hamcrest/JavaHamcrest/compare/hamcrest-java-1.3...v2.1) Signed-off-by: dependabot[bot] --- pom.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index c321ec0f8..a43e6dd6f 100644 --- a/pom.xml +++ b/pom.xml @@ -354,23 +354,17 @@ mockito-core 1.9.5 test + + + org.hamcrest + hamcrest-core + + org.hamcrest - hamcrest-core - 1.3 - test - - - org.hamcrest - hamcrest-library - 1.3 - test - - - org.hamcrest - java-hamcrest - 2.0.0.0 + hamcrest + 2.1 test @@ -396,6 +390,12 @@ jadler-core ${jadler.version} test + + + org.hamcrest + hamcrest-library + + net.jadler From 13eeaa2fcac65fe2c596b1199ee98256ad71b49a Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 8 Jan 2019 10:19:36 +0100 Subject: [PATCH 164/548] ensure all AFM MeasureDefinition descendants serializable --- .../gooddata/executeafm/afm/ArithmeticMeasureDefinition.java | 2 ++ .../com/gooddata/executeafm/afm/DerivedMeasureDefinition.java | 3 +-- .../java/com/gooddata/executeafm/afm/MeasureDefinition.java | 3 ++- .../gooddata/executeafm/afm/OverPeriodMeasureDefinition.java | 3 +-- .../java/com/gooddata/executeafm/afm/PopMeasureDefinition.java | 3 +-- .../executeafm/afm/PreviousPeriodMeasureDefinition.java | 3 +-- .../com/gooddata/executeafm/afm/SimpleMeasureDefinition.java | 3 +-- 7 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java index 9974a82b5..d16ca573f 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java @@ -24,6 +24,8 @@ @JsonRootName(NAME) public class ArithmeticMeasureDefinition implements MeasureDefinition { + private static final long serialVersionUID = -2597112924341600780L; + static final String NAME = "arithmeticMeasure"; private final List measureIdentifiers; diff --git a/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java index bccd533bc..5ca66998a 100644 --- a/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import java.io.Serializable; import java.util.Objects; import static com.gooddata.util.Validate.notNull; @@ -23,7 +22,7 @@ @JsonSubTypes.Type(value = OverPeriodMeasureDefinition.class, name = OverPeriodMeasureDefinition.NAME), @JsonSubTypes.Type(value = PreviousPeriodMeasureDefinition.class, name = PreviousPeriodMeasureDefinition.NAME) }) -public abstract class DerivedMeasureDefinition implements MeasureDefinition, Serializable { +public abstract class DerivedMeasureDefinition implements MeasureDefinition { private static final long serialVersionUID = -1203802872091017113L; diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java index b53f14315..fe6fec1c3 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java @@ -14,6 +14,7 @@ import com.gooddata.md.visualization.VOPopMeasureDefinition; import com.gooddata.md.visualization.VOSimpleMeasureDefinition; +import java.io.Serializable; import java.util.Collection; @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -26,7 +27,7 @@ @JsonSubTypes.Type(value = PreviousPeriodMeasureDefinition.class, name = PreviousPeriodMeasureDefinition.NAME), @JsonSubTypes.Type(value = ArithmeticMeasureDefinition.class, name = ArithmeticMeasureDefinition.NAME) }) -public interface MeasureDefinition { +public interface MeasureDefinition extends Serializable { /** * Returns the definition in the form of uri of {@link com.gooddata.md.Metric}. diff --git a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java index 470b3a5a5..b93b4ea27 100644 --- a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java @@ -12,7 +12,6 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; -import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -26,7 +25,7 @@ * Definition of the period over period measure that is used for the Same period last year and Same period 2 years back comparisons. */ @JsonRootName(NAME) -public class OverPeriodMeasureDefinition extends DerivedMeasureDefinition implements Serializable { +public class OverPeriodMeasureDefinition extends DerivedMeasureDefinition { private static final long serialVersionUID = -8904516814279504098L; diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java index 79f316ae4..a93708a02 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java @@ -13,7 +13,6 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; -import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.Objects; @@ -30,7 +29,7 @@ @Deprecated @JsonRootName(NAME) @JsonInclude(JsonInclude.Include.NON_NULL) -public class PopMeasureDefinition extends DerivedMeasureDefinition implements Serializable { +public class PopMeasureDefinition extends DerivedMeasureDefinition { private static final long serialVersionUID = 1430640153994197345L; diff --git a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java index 80c5389e5..ff214e405 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java @@ -12,7 +12,6 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; -import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -26,7 +25,7 @@ * Definition of the period over period measure that is used for the Previous period comparison. */ @JsonRootName(NAME) -public class PreviousPeriodMeasureDefinition extends DerivedMeasureDefinition implements Serializable { +public class PreviousPeriodMeasureDefinition extends DerivedMeasureDefinition { private static final long serialVersionUID = -4741355657671354062L; diff --git a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java index 08f68a3cd..edccaabd5 100644 --- a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java +++ b/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java @@ -13,7 +13,6 @@ import com.gooddata.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -30,7 +29,7 @@ */ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonRootName(NAME) -public class SimpleMeasureDefinition implements MeasureDefinition, Serializable { +public class SimpleMeasureDefinition implements MeasureDefinition { private static final long serialVersionUID = -385490772711914776L; static final String NAME = "measure"; From c321fb0d88c4bb6e11351eac6b737f5c6b6da368 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 8 Jan 2019 11:28:50 +0100 Subject: [PATCH 165/548] bump version --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 28295f87c..ecf4196d2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.31.0 + 2.32.0+api1 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, @@ -46,7 +46,7 @@ The *GoodData Java SDK* logs using `slf4j-api`. Please adjust your logging confi org.slf4j slf4j-nop - 1.7.25 + 2.32.0+api1 ``` From e92153ae0328830c18503d683b5f4cb63a0d471e Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 8 Jan 2019 11:31:11 +0100 Subject: [PATCH 166/548] [maven-release-plugin] prepare release gooddata-java-2.32.0+api1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d03d235d0..469ddbcdd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.31.1-SNAPSHOT + 2.32.0+api1 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - HEAD + gooddata-java-2.32.0+api1 From 936cffa21a0963088e0b3fe0dfdb3b1306ce3eb0 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 8 Jan 2019 11:31:11 +0100 Subject: [PATCH 167/548] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 469ddbcdd..6d2770c1a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 gooddata-java - 2.32.0+api1 + 2.32.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java @@ -24,7 +24,7 @@ git@github.com:gooddata/gooddata-java.git scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} - gooddata-java-2.32.0+api1 + HEAD From d5b92f3677083ffc2da35b116fb0c26c877d164f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 14 Jan 2019 13:19:40 +0000 Subject: [PATCH 168/548] Bump json-unit.version from 2.2.0 to 2.3.0 Bumps `json-unit.version` from 2.2.0 to 2.3.0. Updates `json-unit` from 2.2.0 to 2.3.0 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.2.0...json-unit-parent-2.3.0) Updates `json-unit-core` from 2.2.0 to 2.3.0 - [Release notes](https://github.com/lukas-krecan/JsonUnit/releases) - [Commits](https://github.com/lukas-krecan/JsonUnit/compare/json-unit-parent-2.2.0...json-unit-parent-2.3.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6d2770c1a..c5f46d767 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 1.7.25 4.3.18.RELEASE 1.3.0 - 2.2.0 + 2.3.0 2.22.1 2.22.1 From 53ff00fe3c5cd2158cf0865e07f00c8c8f407890 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 18 Jan 2019 13:23:59 +0000 Subject: [PATCH 169/548] Bump httpcore from 4.4.10 to 4.4.11 Bumps httpcore from 4.4.10 to 4.4.11. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c5f46d767..f1968a95e 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 4.5.6 - 4.4.10 + 4.4.11 2.8.11 2.8.11.2 1.7.25 From 99bf4d9ea6906cd73771948f92077686e0727a68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 24 Jan 2019 13:24:14 +0000 Subject: [PATCH 170/548] Bump jacoco-maven-plugin from 0.8.2 to 0.8.3 Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.2 to 0.8.3. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.2...v0.8.3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f1968a95e..6dd4a21ba 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ org.jacoco jacoco-maven-plugin - 0.8.2 + 0.8.3 jacoco-prepare-agent From a50d9f7aa7821298370b0e45adb22cf2faa8d792 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 28 Jan 2019 13:15:41 +0000 Subject: [PATCH 171/548] Bump httpclient from 4.5.6 to 4.5.7 Bumps httpclient from 4.5.6 to 4.5.7. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6dd4a21ba..c527e7658 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 4.5.6 + 4.5.7 4.4.11 2.8.11 2.8.11.2 From 693f3226a93c2c9cecfa102da0c180193e5149df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 18 Jan 2019 14:27:10 +0000 Subject: [PATCH 172/548] Bump jackson.version from 2.8.11 to 2.9.8 Bumps `jackson.version` from 2.8.11 to 2.9.8. Updates `jackson-core` from 2.8.11 to 2.9.8 - [Release notes](https://github.com/FasterXML/jackson-core/releases) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.8.11...jackson-core-2.9.8) Updates `jackson-annotations` from 2.8.11 to 2.9.8 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Signed-off-by: dependabot[bot] --- README.md | 2 +- pom.xml | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ecf4196d2..b8886b034 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The *GoodData Java SDK* uses: * the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) version 0.9.3 or later * the *Apache HTTP Client* version 4.5 or later (for white-labeled domains at least version 4.3.2 is required) * the *Spring Framework* version 4.3.* -* the *Jackson JSON Processor* version 2.8.* +* the *Jackson JSON Processor* version 2.* * the *Slf4j API* version 1.7.* * the *Java Development Kit (JDK)* version 8 or later diff --git a/pom.xml b/pom.xml index f1968a95e..e7b4baecc 100644 --- a/pom.xml +++ b/pom.xml @@ -41,8 +41,7 @@ 4.5.6 4.4.11 - 2.8.11 - 2.8.11.2 + 2.9.8 1.7.25 4.3.18.RELEASE 1.3.0 @@ -320,7 +319,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.databind.version} + ${jackson.version} com.fasterxml.jackson.core From c1392f585f73d2c385bf8b27f64c9a97ad7cf16f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 4 Feb 2019 13:14:53 +0000 Subject: [PATCH 173/548] Bump gooddata-http-client from 0.9.4 to 1.0.0 Bumps [gooddata-http-client](https://github.com/gooddata/gooddata-http-client) from 0.9.4 to 1.0.0. - [Release notes](https://github.com/gooddata/gooddata-http-client/releases) - [Commits](https://github.com/gooddata/gooddata-http-client/compare/gooddata-http-client-0.9.4...gooddata-http-client-1.0.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2bbca1d15..56b30783a 100644 --- a/pom.xml +++ b/pom.xml @@ -263,7 +263,7 @@ com.gooddata gooddata-http-client - 0.9.4 + 1.0.0 org.apache.commons From 28bd1cd6b9615e95af3e90a6eeca4aec693eac41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Mikul=C3=A1=C5=A1ek?= Date: Wed, 19 Dec 2018 14:55:05 +0100 Subject: [PATCH 174/548] Split SDK into model and service modules --- findBugsFilter.xml | 2 +- gooddata-java-model/pom.xml | 125 +++++ .../gooddata/sdk/model}/account/Account.java | 13 +- .../sdk/model}/auditevent/AuditEvent.java | 4 +- .../sdk/model}/auditevent/AuditEvents.java | 4 +- .../auditevent/AuditEventsDeserializer.java | 4 +- .../auditevent/AuditEventsSerializer.java | 4 +- .../sdk/model}/connector/ConnectorType.java | 4 +- .../sdk/model}/connector/CoupaInstance.java | 6 +- .../sdk/model}/connector/CoupaInstances.java | 10 +- .../connector/CoupaProcessExecution.java | 4 +- .../sdk/model}/connector/CoupaSettings.java | 4 +- .../sdk/model}/connector/Integration.java | 4 +- .../connector/IntegrationProcessStatus.java | 4 +- .../connector/PardotProcessExecution.java | 4 +- .../sdk/model}/connector/PardotSettings.java | 4 +- .../model}/connector/ProcessExecution.java | 4 +- .../sdk/model}/connector/ProcessStatus.java | 4 +- .../sdk/model}/connector/Settings.java | 4 +- .../gooddata/sdk/model}/connector/Status.java | 10 +- .../connector/Zendesk4ProcessExecution.java | 6 +- .../model}/connector/Zendesk4Settings.java | 6 +- .../sdk/model}/dataload/OutputStage.java | 9 +- .../model}/dataload/processes/AsyncTask.java | 8 +- .../dataload/processes/DataloadProcess.java | 4 +- .../dataload/processes/DataloadProcesses.java | 10 +- .../dataload/processes/ProcessExecution.java | 6 +- .../processes/ProcessExecutionDetail.java | 4 +- .../processes/ProcessExecutionTask.java | 10 +- .../dataload/processes/ProcessType.java | 4 +- .../model}/dataload/processes/Schedule.java | 4 +- .../dataload/processes/ScheduleExecution.java | 6 +- .../dataload/processes/ScheduleState.java | 4 +- .../model}/dataload/processes/Schedules.java | 6 +- .../processes/SchedulesDeserializer.java | 4 +- .../gooddata/sdk/model}/dataset/Dataset.java | 10 +- .../sdk/model}/dataset/DatasetLinks.java | 8 +- .../sdk/model}/dataset/DatasetManifest.java | 4 +- .../sdk/model}/dataset/DatasetManifests.java | 6 +- .../dataset/DatasetNotFoundException.java | 4 +- .../gooddata/sdk/model}/dataset/Datasets.java | 8 +- .../gooddata/sdk/model}/dataset/EtlMode.java | 6 +- .../sdk/model}/dataset/EtlModeType.java | 6 +- .../sdk/model}/dataset/LookupMode.java | 6 +- .../gooddata/sdk/model}/dataset/MaqlDml.java | 8 +- .../com/gooddata/sdk/model}/dataset/Pull.java | 6 +- .../gooddata/sdk/model}/dataset/PullTask.java | 6 +- .../sdk/model}/dataset/TaskState.java | 6 +- .../gooddata/sdk/model}/dataset/Upload.java | 4 +- .../sdk/model}/dataset/UploadMode.java | 4 +- .../sdk/model}/dataset/UploadStatistics.java | 4 +- .../gooddata/sdk/model}/dataset/Uploads.java | 8 +- .../sdk/model}/dataset/UploadsInfo.java | 22 +- .../sdk/model}/executeafm/Execution.java | 8 +- .../executeafm/IdentifierObjQualifier.java | 9 +- .../sdk/model}/executeafm/ObjQualifier.java | 9 +- .../sdk/model}/executeafm/ResultPage.java | 14 +- .../model}/executeafm/UriObjQualifier.java | 9 +- .../executeafm/VisualizationExecution.java | 10 +- .../executeafm/afm/AbsoluteDateFilter.java | 10 +- .../sdk/model}/executeafm/afm/Afm.java | 4 +- .../model}/executeafm/afm/Aggregation.java | 4 +- .../afm/ArithmeticMeasureDefinition.java | 12 +- .../executeafm/afm/AttributeFilter.java | 6 +- .../model}/executeafm/afm/AttributeItem.java | 13 +- .../executeafm/afm/CompatibilityFilter.java | 4 +- .../sdk/model}/executeafm/afm/DateFilter.java | 6 +- .../afm/DerivedMeasureDefinition.java | 4 +- .../executeafm/afm/ExpressionFilter.java | 4 +- .../sdk/model}/executeafm/afm/FilterItem.java | 11 +- .../executeafm/afm/LocallyIdentifiable.java | 4 +- .../executeafm/afm/MeasureDefinition.java | 19 +- .../model}/executeafm/afm/MeasureItem.java | 4 +- .../executeafm/afm/NativeTotalItem.java | 4 +- .../afm/NegativeAttributeFilter.java | 10 +- .../afm/ObjIdentifierUtilities.java | 12 +- .../executeafm/afm/ObjQualifierConverter.java | 10 +- .../afm/OverPeriodDateAttribute.java | 6 +- .../afm/OverPeriodMeasureDefinition.java | 10 +- .../executeafm/afm/PopMeasureDefinition.java | 13 +- .../afm/PositiveAttributeFilter.java | 8 +- .../afm/PreviousPeriodDateDataSet.java | 6 +- .../afm/PreviousPeriodMeasureDefinition.java | 10 +- .../executeafm/afm/RelativeDateFilter.java | 8 +- .../afm/SimpleMeasureDefinition.java | 13 +- .../executeafm/response/AttributeHeader.java | 11 +- .../response/AttributeInHeader.java | 4 +- .../response/ExecutionResponse.java | 10 +- .../model}/executeafm/response/Header.java | 7 +- .../response/MeasureGroupHeader.java | 4 +- .../response/MeasureHeaderItem.java | 11 +- .../executeafm/response/ResultDimension.java | 7 +- .../executeafm/response/TotalHeaderItem.java | 6 +- .../result/AttributeHeaderItem.java | 9 +- .../sdk/model}/executeafm/result/Data.java | 4 +- .../model}/executeafm/result/DataList.java | 6 +- .../model}/executeafm/result/DataValue.java | 11 +- .../executeafm/result/ExecutionResult.java | 7 +- .../sdk/model}/executeafm/result/Paging.java | 4 +- .../executeafm/result/ResultHeaderItem.java | 4 +- .../result/ResultMeasureHeaderItem.java | 6 +- .../result/ResultTotalHeaderItem.java | 8 +- .../sdk/model}/executeafm/result/Warning.java | 4 +- .../resultspec/AttributeLocatorItem.java | 4 +- .../resultspec/AttributeSortAggregation.java | 4 +- .../resultspec/AttributeSortItem.java | 4 +- .../executeafm/resultspec/Dimension.java | 6 +- .../executeafm/resultspec/Direction.java | 4 +- .../executeafm/resultspec/LocatorItem.java | 4 +- .../resultspec/MeasureLocatorItem.java | 4 +- .../resultspec/MeasureSortItem.java | 4 +- .../executeafm/resultspec/ResultSpec.java | 6 +- .../executeafm/resultspec/SortItem.java | 4 +- .../executeafm/resultspec/TotalItem.java | 8 +- .../resultspec/TotalLocatorItem.java | 4 +- .../sdk/model}/export/ClientExport.java | 12 +- .../sdk/model}/export/ExecuteReport.java | 6 +- .../export/ExecuteReportDefinition.java | 6 +- .../sdk/model}/export/ExportFormat.java | 4 +- .../sdk/model}/export/ReportRequest.java | 4 +- .../sdk/model}/featureflag/FeatureFlag.java | 4 +- .../sdk/model}/featureflag/FeatureFlags.java | 4 +- .../featureflag/ProjectFeatureFlag.java | 4 +- .../featureflag/ProjectFeatureFlags.java | 6 +- .../gooddata/sdk/model}/gdc/AboutLinks.java | 4 +- .../gooddata/sdk/model}/gdc/AbstractMaql.java | 4 +- .../gooddata/sdk/model}/gdc/AsyncTask.java | 4 +- .../java/com/gooddata/sdk/model}/gdc/Gdc.java | 5 +- .../gooddata/sdk/model}/gdc/LinkEntries.java | 4 +- .../gooddata/sdk/model}/gdc/RootLinks.java | 4 +- .../gooddata/sdk/model}/gdc/TaskStatus.java | 5 +- .../gooddata/sdk/model}/gdc/UriResponse.java | 4 +- .../gooddata/sdk/model}/lcm/LcmEntities.java | 4 +- .../gooddata/sdk/model}/lcm/LcmEntity.java | 15 +- .../gooddata/sdk/model}/md/AbstractObj.java | 4 +- .../gooddata/sdk/model}/md/Attachment.java | 4 +- .../com/gooddata/sdk/model}/md/Attribute.java | 4 +- .../sdk/model}/md/AttributeDisplayForm.java | 4 +- .../sdk/model}/md/AttributeElement.java | 4 +- .../sdk/model}/md/AttributeElements.java | 6 +- .../gooddata/sdk/model}/md/AttributeSort.java | 4 +- .../com/gooddata/sdk/model}/md/BulkGet.java | 6 +- .../gooddata/sdk/model}/md/BulkGetUris.java | 8 +- .../com/gooddata/sdk/model}/md/Column.java | 4 +- .../sdk/model}/md/DashboardAttachment.java | 4 +- .../sdk/model}/md/DataLoadingColumn.java | 6 +- .../com/gooddata/sdk/model}/md/Dataset.java | 4 +- .../com/gooddata/sdk/model}/md/Dimension.java | 4 +- .../gooddata/sdk/model}/md/DisplayForm.java | 4 +- .../com/gooddata/sdk/model}/md/Entry.java | 6 +- .../gooddata/sdk/model}/md/Expression.java | 4 +- .../java/com/gooddata/sdk/model}/md/Fact.java | 4 +- .../sdk/model}/md/IdentifierAndUri.java | 4 +- .../sdk/model}/md/IdentifierToUri.java | 8 +- .../sdk/model}/md/IdentifiersAndUris.java | 6 +- .../com/gooddata/sdk/model}/md/InUseMany.java | 6 +- .../java/com/gooddata/sdk/model}/md/Key.java | 4 +- .../com/gooddata/sdk/model}/md/MaqlAst.java | 4 +- .../java/com/gooddata/sdk/model}/md/Meta.java | 10 +- .../com/gooddata/sdk/model}/md/Metric.java | 4 +- .../sdk/model}/md/NestedAttribute.java | 4 +- .../java/com/gooddata/sdk/model}/md/Obj.java | 12 +- .../sdk/model}/md/ProjectDashboard.java | 4 +- .../com/gooddata/sdk/model}/md/Query.java | 4 +- .../com/gooddata/sdk/model}/md/Queryable.java | 4 +- .../sdk/model}/md/ReportAttachment.java | 6 +- .../gooddata/sdk/model}/md/Restriction.java | 6 +- .../gooddata/sdk/model}/md/ScheduledMail.java | 10 +- .../sdk/model}/md/ScheduledMailWhen.java | 6 +- .../com/gooddata/sdk/model}/md/Table.java | 4 +- .../gooddata/sdk/model}/md/TableDataLoad.java | 4 +- .../com/gooddata/sdk/model}/md/Updatable.java | 4 +- .../com/gooddata/sdk/model}/md/Usage.java | 6 +- .../com/gooddata/sdk/model}/md/UseMany.java | 8 +- .../sdk/model}/md/UseManyEntries.java | 6 +- .../md/maintenance/PartialMdArtifact.java | 8 +- .../md/maintenance/PartialMdExport.java | 4 +- .../md/maintenance/PartialMdExportToken.java | 6 +- .../sdk/model}/md/report/AttributeInGrid.java | 8 +- .../gooddata/sdk/model}/md/report/Filter.java | 4 +- .../gooddata/sdk/model}/md/report/Grid.java | 4 +- .../sdk/model}/md/report/GridElement.java | 4 +- .../md/report/GridElementDeserializer.java | 6 +- .../md/report/GridElementSerializer.java | 4 +- .../report/GridReportDefinitionContent.java | 6 +- .../sdk/model}/md/report/MetricElement.java | 6 +- .../sdk/model}/md/report/MetricGroup.java | 4 +- .../OneNumberReportDefinitionContent.java | 6 +- .../gooddata/sdk/model}/md/report/Report.java | 16 +- .../model}/md/report/ReportDefinition.java | 12 +- .../md/report/ReportDefinitionContent.java | 4 +- .../gooddata/sdk/model}/md/report/Total.java | 4 +- .../sdk/model}/md/visualization/Bucket.java | 6 +- .../model}/md/visualization/BucketItem.java | 4 +- .../md/visualization/CollectionType.java | 4 +- .../sdk/model}/md/visualization/Measure.java | 8 +- .../visualization/VOPopMeasureDefinition.java | 13 +- .../VOSimpleMeasureDefinition.java | 24 +- .../visualization/VisualizationAttribute.java | 8 +- .../md/visualization/VisualizationClass.java | 12 +- .../visualization/VisualizationConverter.java | 50 +- .../md/visualization/VisualizationObject.java | 34 +- .../md/visualization/VisualizationType.java | 4 +- .../sdk/model}/notification/Channel.java | 8 +- .../model}/notification/Configuration.java | 4 +- .../notification/EmailConfiguration.java | 4 +- .../model}/notification/MessageTemplate.java | 4 +- .../sdk/model}/notification/ProjectEvent.java | 4 +- .../sdk/model}/notification/Subscription.java | 6 +- .../sdk/model}/notification/TimerEvent.java | 4 +- .../sdk/model}/notification/Trigger.java | 4 +- .../model}/notification/TriggerCondition.java | 4 +- .../model}/project/CreatedInvitations.java | 4 +- .../sdk/model}/project/Environment.java | 4 +- .../sdk/model}/project/Invitation.java | 6 +- .../sdk/model}/project/Invitations.java | 12 +- .../gooddata/sdk/model}/project/Project.java | 6 +- .../sdk/model}/project/ProjectDriver.java | 4 +- .../model}/project/ProjectEnvironment.java | 6 +- .../sdk/model}/project/ProjectTemplate.java | 4 +- .../sdk/model}/project/ProjectTemplates.java | 6 +- .../project/ProjectUsersUpdateResult.java | 6 +- .../project/ProjectValidationResult.java | 4 +- ...ProjectValidationResultGdcTimeElParam.java | 5 +- .../project/ProjectValidationResultItem.java | 4 +- .../ProjectValidationResultObjectParam.java | 4 +- .../project/ProjectValidationResultParam.java | 4 +- .../ProjectValidationResultSliElParam.java | 4 +- .../ProjectValidationResultStringParam.java | 4 +- .../project/ProjectValidationResults.java | 4 +- .../model}/project/ProjectValidationType.java | 4 +- .../model}/project/ProjectValidations.java | 8 +- .../gooddata/sdk/model}/project/Projects.java | 4 +- .../com/gooddata/sdk/model}/project/Role.java | 8 +- .../gooddata/sdk/model}/project/Roles.java | 8 +- .../com/gooddata/sdk/model}/project/User.java | 8 +- .../gooddata/sdk/model}/project/Users.java | 8 +- .../sdk/model}/project/UsersDeserializer.java | 4 +- .../sdk/model}/project/UsersSerializer.java | 4 +- .../sdk/model/project}/model/DiffRequest.java | 4 +- .../sdk/model/project}/model/MaqlDdl.java | 8 +- .../model/project}/model/MaqlDdlLinks.java | 7 +- .../sdk/model/project}/model/ModelDiff.java | 6 +- .../sdk/model}/projecttemplate/Template.java | 4 +- .../sdk/model}/projecttemplate/Templates.java | 10 +- .../sdk/model}/report/ReportExportFormat.java | 8 +- .../sdk/model}/util/TagsDeserializer.java | 4 +- .../sdk/model}/util/TagsSerializer.java | 4 +- .../sdk/model}/warehouse/Warehouse.java | 6 +- .../sdk/model}/warehouse/WarehouseSchema.java | 4 +- .../model}/warehouse/WarehouseSchemas.java | 4 +- .../WarehouseSchemasDeserializer.java | 4 +- .../sdk/model}/warehouse/WarehouseTask.java | 12 +- .../sdk/model}/warehouse/WarehouseUser.java | 6 +- .../model}/warehouse/WarehouseUserRole.java | 4 +- .../sdk/model}/warehouse/WarehouseUsers.java | 4 +- .../warehouse/WarehouseUsersDeserializer.java | 4 +- .../warehouse/WarehouseUsersSerializer.java | 8 +- .../sdk/model}/warehouse/Warehouses.java | 4 +- .../warehouse/WarehousesDeserializer.java | 4 +- .../warehouse/WarehousesSerializer.java | 8 +- .../src}/main/resources/GoodDataApiVersion | 0 .../model}/executeafm/ExecutionTest.groovy | 22 +- .../IdentifierObjQualifierTest.groovy | 4 +- .../model}/executeafm/ObjQualifierTest.groovy | 4 +- .../model}/executeafm/ResultPageTest.groovy | 4 +- .../executeafm/UriObjQualifierTest.groovy | 4 +- .../VisualizationExecutionTest.groovy | 16 +- .../afm/AbsoluteDateFilterTest.groovy | 8 +- .../sdk/model}/executeafm/afm/AfmTest.groovy | 8 +- .../ArithmeticMeasureDefinitionTest.groovy | 6 +- .../executeafm/afm/AttributeItemTest.groovy | 8 +- .../afm/CompatibilityFilterTest.groovy | 4 +- .../afm/ExpressionFilterTest.groovy | 4 +- .../executeafm/afm/FilterItemTest.groovy | 4 +- .../afm/MeasureDefinitionTest.groovy | 4 +- .../executeafm/afm/MeasureItemTest.groovy | 6 +- .../executeafm/afm/NativeTotalItemTest.groovy | 4 +- .../afm/NegativeAttributeFilterTest.groovy | 10 +- .../afm/ObjIdentifierUtilitiesTest.groovy | 12 +- .../afm/OverPeriodDateAttributeTest.groovy | 6 +- .../OverPeriodMeasureDefinitionTest.groovy | 8 +- .../afm/PopMeasureDefinitionTest.groovy | 9 +- .../afm/PositiveAttributeFilterTest.groovy | 10 +- .../afm/PreviousPeriodDateDataSetTest.groovy | 6 +- ...PreviousPeriodMeasureDefinitionTest.groovy | 8 +- .../afm/RelativeDateFilterTest.groovy | 8 +- .../afm/SimpleMeasureDefinitionTest.groovy | 8 +- .../response/AttributeHeaderTest.groovy | 4 +- .../response/AttributeInHeaderTest.groovy | 4 +- .../response/ExecutionResponseTest.groovy | 4 +- .../executeafm/response/HeaderTest.groovy | 4 +- .../response/MeasureGroupHeaderTest.groovy | 4 +- .../response/MeasureHeaderItemTest.groovy | 4 +- .../response/ResultDimensionTest.groovy | 4 +- .../response/TotalHeaderItemTest.groovy | 6 +- .../result/AttributeHeaderItemTest.groovy | 4 +- .../executeafm/result/DataListTest.groovy | 4 +- .../model}/executeafm/result/DataTest.groovy | 4 +- .../executeafm/result/DataValueTest.groovy | 4 +- .../result/ExecutionResultTest.groovy | 4 +- .../executeafm/result/PagingTest.groovy | 4 +- .../result/ResultHeaderItemTest.groovy | 4 +- .../result/ResultMeasureHeaderItemTest.groovy | 4 +- .../result/ResultTotalHeaderItemTest.groovy | 6 +- .../executeafm/result/WarningTest.groovy | 4 +- .../AttributeLocatorItemTest.groovy | 4 +- .../resultspec/AttributeSortItemTest.groovy | 4 +- .../resultspec/DimensionTest.groovy | 6 +- .../resultspec/MeasureLocatorItemTest.groovy | 4 +- .../resultspec/MeasureSortItemTest.groovy | 4 +- .../resultspec/ResultSpecTest.groovy | 4 +- .../resultspec/TotalItemTest.groovy | 6 +- .../resultspec/TotalLocatorItemTest.groovy | 4 +- .../sdk/model}/lcm/LcmEntitiesTest.groovy | 4 +- .../sdk/model}/lcm/LcmEntityTest.groovy | 4 +- .../sdk/model}/md/report/TotalTest.groovy | 16 +- .../model}/md/visualization/BucketTest.groovy | 6 +- .../md/visualization/MeasureTest.groovy | 6 +- .../VisualizationAttributeTest.groovy | 6 +- .../VisualizationClassTest.groovy | 7 +- .../VisualizationConverterTest.groovy | 34 +- .../VisualizationObjectTest.groovy | 14 +- .../sdk/model}/account/AccountTest.java | 4 +- .../sdk/model}/auditevent/AuditEventTest.java | 4 +- .../model}/auditevent/AuditEventsTest.java | 8 +- .../model}/connector/CoupaInstanceTest.java | 4 +- .../model}/connector/CoupaInstancesTest.java | 4 +- .../connector/CoupaProcessExecutionTest.java | 4 +- .../model}/connector/CoupaSettingsTest.java | 4 +- .../IntegrationProcessStatusTest.java | 12 +- .../sdk/model}/connector/IntegrationTest.java | 4 +- .../connector/PardotProcessExecutionTest.java | 4 +- .../model}/connector/PardotSettingsTest.java | 4 +- .../connector/ProcessExecutionTest.java | 6 +- .../model}/connector/ProcessStatusTest.java | 6 +- .../sdk/model}/connector/StatusTest.java | 12 +- .../Zendesk4ProcessExecutionTest.java | 6 +- .../connector/Zendesk4SettingsTest.java | 8 +- .../sdk/model}/dataload/OutputStageTest.java | 4 +- .../processes/DataloadProcessTest.java | 4 +- .../processes/DataloadProcessesTest.java | 4 +- .../processes/ProcessExecutionDetailTest.java | 4 +- .../processes/ProcessExecutionTaskTest.java | 4 +- .../processes/ProcessExecutionTest.java | 4 +- .../processes/ScheduleExecutionTest.java | 4 +- .../dataload/processes/ScheduleTest.java | 4 +- .../dataload/processes/SchedulesTest.java | 4 +- .../sdk/model}/dataset/DatasetLinksTest.java | 6 +- .../model}/dataset/DatasetManifestTest.java | 4 +- .../sdk/model}/dataset/DatasetTest.java | 4 +- .../sdk/model}/dataset/DatasetsTest.java | 6 +- .../sdk/model}/dataset/MaqlDmlTest.java | 5 +- .../sdk/model}/dataset/PullTaskTest.java | 4 +- .../gooddata/sdk/model}/dataset/PullTest.java | 4 +- .../sdk/model}/dataset/TaskStateTest.java | 4 +- .../model}/dataset/UploadStatisticsTest.java | 7 +- .../sdk/model}/dataset/UploadTest.java | 4 +- .../sdk/model}/dataset/UploadsInfoTest.java | 4 +- .../sdk/model}/dataset/UploadsTest.java | 4 +- .../sdk/model}/export/ClientExportTest.java | 7 +- .../export/ExecuteReportDefinitionTest.java | 4 +- .../sdk/model}/export/ExecuteReportTest.java | 4 +- .../sdk/model}/export/ExportFormatTest.java | 8 +- .../model}/featureflag/FeatureFlagTest.java | 4 +- .../model}/featureflag/FeatureFlagsTest.java | 4 +- .../featureflag/ProjectFeatureFlagTest.java | 4 +- .../featureflag/ProjectFeatureFlagsTest.java | 4 +- .../sdk/model}/gdc/AboutLinksTest.java | 4 +- .../sdk/model}/gdc/AsyncTaskTest.java | 4 +- .../com/gooddata/sdk/model}/gdc/GdcTest.java | 4 +- .../sdk/model}/gdc/LinkEntriesTest.java | 4 +- .../sdk/model}/gdc/RootLinksTest.java | 4 +- .../sdk/model}/gdc/TaskStatusTest.java | 5 +- .../sdk/model}/gdc/UriResponseTest.java | 4 +- .../sdk/model}/md/AttachmentTest.java | 4 +- .../model}/md/AttributeDisplayFormTest.java | 4 +- .../sdk/model}/md/AttributeElementTest.java | 4 +- .../sdk/model}/md/AttributeElementsTest.java | 4 +- .../sdk/model}/md/AttributeSortTest.java | 4 +- .../gooddata/sdk/model}/md/AttributeTest.java | 4 +- .../sdk/model}/md/BulkGetUrisTest.java | 4 +- .../gooddata/sdk/model}/md/ColumnTest.java | 4 +- .../model}/md/DashboardAttachmentTest.java | 4 +- .../sdk/model}/md/DataLoadingColumnTest.java | 4 +- .../gooddata/sdk/model}/md/DatasetTest.java | 4 +- .../gooddata/sdk/model}/md/DimensionTest.java | 4 +- .../sdk/model}/md/DisplayFormTest.java | 4 +- .../com/gooddata/sdk/model}/md/EntryTest.java | 4 +- .../sdk/model}/md/ExpressionTest.java | 4 +- .../com/gooddata/sdk/model}/md/FactTest.java | 4 +- .../sdk/model}/md/IdentifierToUriTest.java | 4 +- .../gooddata/sdk/model}/md/InUseManyTest.java | 4 +- .../com/gooddata/sdk/model}/md/KeyTest.java | 4 +- .../com/gooddata/sdk/model}/md/MetaTest.java | 4 +- .../gooddata/sdk/model}/md/MetricTest.java | 4 +- .../sdk/model}/md/NestedAttributeTest.java | 4 +- .../com/gooddata/sdk/model}/md/ObjTest.java | 4 +- .../sdk/model}/md/ProjectDashboardTest.java | 6 +- .../com/gooddata/sdk/model}/md/QueryTest.java | 4 +- .../sdk/model}/md/ReportAttachmentTest.java | 8 +- .../sdk/model}/md/RestrictionTest.java | 4 +- .../sdk/model}/md/ScheduledMailTest.java | 6 +- .../sdk/model}/md/ScheduledMailWhenTest.java | 4 +- .../sdk/model}/md/TableDataLoadTest.java | 4 +- .../com/gooddata/sdk/model}/md/TableTest.java | 4 +- .../md/maintenance/PartialMdArtifactTest.java | 6 +- .../md/maintenance/PartialMdExportTest.java | 4 +- .../maintenance/PartialMdExportTokenTest.java | 4 +- .../model}/md/report/AttributeInGridTest.java | 8 +- .../report/GridElementDeserializerTest.java | 4 +- .../md/report/GridElementSerializerTest.java | 6 +- .../GridReportDefinitionContentTest.java | 4 +- .../sdk/model}/md/report/GridTest.java | 6 +- .../model}/md/report/MetricElementTest.java | 6 +- .../OneNumberReportDefinitionContentTest.java | 4 +- .../report/ReportDefinitionContentTest.java | 4 +- .../md/report/ReportDefinitionTest.java | 4 +- .../sdk/model}/md/report/ReportTest.java | 4 +- .../sdk/model}/notification/ChannelTest.java | 4 +- .../model}/notification/ConditionTest.java | 4 +- .../notification/EmailConfigurationTest.java | 4 +- .../notification/MessageTemplateTest.java | 4 +- .../model}/notification/ProjectEventTest.java | 4 +- .../model}/notification/SubscriptionTest.java | 6 +- .../model}/notification/TimerEventTest.java | 4 +- .../project/CreatedInvitationsTest.java | 4 +- .../sdk/model}/project/InvitationsTest.java | 4 +- .../model}/project/ProjectTemplateTest.java | 4 +- .../model}/project/ProjectTemplatesTest.java | 4 +- .../sdk/model}/project/ProjectTest.java | 4 +- .../project/ProjectUsersUpdateResultTest.java | 4 +- ...ectValidationResultGdcTimeElParamTest.java | 4 +- .../ProjectValidationResultItemTest.java | 4 +- ...rojectValidationResultObjectParamTest.java | 4 +- .../ProjectValidationResultParamTest.java | 5 +- ...ProjectValidationResultSliElParamTest.java | 4 +- ...rojectValidationResultStringParamTest.java | 4 +- .../project/ProjectValidationResultTest.java | 4 +- .../project/ProjectValidationResultsTest.java | 4 +- .../project/ProjectValidationTypeTest.java | 4 +- .../project/ProjectValidationsTest.java | 6 +- .../gooddata/sdk/model}/project/RoleTest.java | 4 +- .../sdk/model}/project/RolesTest.java | 4 +- .../gooddata/sdk/model}/project/UserTest.java | 4 +- .../sdk/model}/project/UsersTest.java | 6 +- .../model/project}/model/DiffRequestTest.java | 4 +- .../project}/model/MaqlDdlLinksTest.java | 4 +- .../sdk/model/project}/model/MaqlDdlTest.java | 4 +- .../model/project}/model/ModelDiffTest.java | 6 +- .../model}/projecttemplate/TemplateTest.java | 4 +- .../model}/report/ReportExportFormatTest.java | 6 +- .../sdk/model}/util/TagsDeserializerTest.java | 4 +- .../sdk/model}/util/TagsSerializerTest.java | 4 +- .../sdk/model}/util/TagsTestClass.java | 4 +- .../model}/warehouse/WarehouseSchemaTest.java | 4 +- .../warehouse/WarehouseSchemasTest.java | 4 +- .../model}/warehouse/WarehouseTaskTest.java | 4 +- .../sdk/model}/warehouse/WarehouseTest.java | 6 +- .../model}/warehouse/WarehouseUserTest.java | 6 +- .../model}/warehouse/WarehouseUsersTest.java | 4 +- .../sdk/model}/warehouse/WarehousesTest.java | 4 +- .../test/resources/account/account-input.json | 0 .../src}/test/resources/account/account.json | 0 .../resources/account/create-account.json | 0 .../resources/auditevents/auditEvent.json | 0 .../auditevents/auditEventWithParam.json | 0 .../auditEventWithParamAndLink.json | 0 .../resources/auditevents/auditEvents.json | 0 .../auditevents/emptyAuditEvents.json | 0 .../auditevents/userAuditEvents.json | 0 .../resources/connector/coupa_instance.json | 0 .../resources/connector/coupa_instances.json | 0 .../resources/connector/integration-in.json | 0 .../test/resources/connector/integration.json | 0 .../process-execution-coupa-downloadDate.json | 0 .../connector/process-execution-empty.json | 0 .../process-execution-incremental.json | 0 .../process-execution-pardot-changesFrom.json | 0 .../connector/process-execution-reload.json | 0 .../process-execution-zendesk4-download.json | 0 .../process-execution-zendesk4-startDate.json | 0 .../connector/process-status-embedded.json | 0 .../connector/process-status-error.json | 0 .../resources/connector/settings-coupa.json | 0 .../resources/connector/settings-pardot.json | 0 .../settings-zendesk4-before-template26.json | 0 .../connector/settings-zendesk4.json | 0 .../test/resources/dataload/outputStage.json | 0 .../dataload/outputStageAllFields.json | 0 .../dataload/outputStageNoProcess.json | 0 .../processes/emptyScheduleExecution.json | 0 .../dataload/processes/execution.json | 0 .../dataload/processes/executionDetail.json | 0 .../dataload/processes/executionTask.json | 0 .../processes/process-input-withPath.json | 0 .../dataload/processes/process-input.json | 0 .../resources/dataload/processes/process.json | 0 .../dataload/processes/processes.json | 0 .../processes/schedule-input-all-fields.json | 0 .../dataload/processes/schedule-input.json | 0 .../processes/schedule-triggered-input.json | 0 .../processes/schedule-triggered.json | 0 .../dataload/processes/schedule.json | 0 .../dataload/processes/scheduleExecution.json | 0 .../dataload/processes/schedules.json | 0 .../dataload/processes/schedules_page1.json | 0 .../src}/test/resources/dataset/dataset.json | 0 .../test/resources/dataset/datasetLinks.json | 0 .../dataset/datasetManifest-input.json | 0 .../resources/dataset/datasetManifest.json | 0 .../src}/test/resources/dataset/maqlDml.json | 0 .../src}/test/resources/dataset/pull.json | 0 .../src}/test/resources/dataset/pullTask.json | 0 .../test/resources/dataset/taskStateOK.json | 0 .../resources/dataset/uploads/data-sets.json | 0 .../dataset/uploads/data-uploads-info.json | 0 .../resources/dataset/uploads/upload.json | 0 .../resources/dataset/uploads/uploads.json | 0 .../executeafm/afm/absoluteDateFilter.json | 0 .../test/resources/executeafm/afm/afm.json | 0 .../afm/arithmeticMeasureDefinition.json | 0 .../executeafm/afm/attributeItem.json | 0 .../executeafm/afm/attributeItemFull.json | 0 .../executeafm/afm/expressionFilter.json | 0 .../resources/executeafm/afm/measureItem.json | 0 .../executeafm/afm/measureItemFull.json | 0 .../executeafm/afm/nativeTotalItem.json | 0 .../afm/negativeAttributeFilter.json | 0 .../afm/overPeriodDateAttribute.json | 0 .../afm/overPeriodMeasureDefinition.json | 0 ...iodMeasureDefinitionWithTwoAttributes.json | 0 .../executeafm/afm/popMeasureDefinition.json | 0 .../afm/positiveAttributeFilter.json | 0 .../afm/previousPeriodDateDataSet.json | 0 .../afm/previousPeriodMeasureDefinition.json | 0 ...eriodMeasureDefinitionWithTwoDataSets.json | 0 .../executeafm/afm/relativeDateFilter.json | 0 .../afm/simpleMeasureDefinition.json | 0 .../afm/simpleMeasureDefinitionFull.json | 0 .../src}/test/resources/executeafm/empty.json | 0 .../test/resources/executeafm/execution.json | 0 .../resources/executeafm/executionFull.json | 0 .../executeafm/identifierObjQualifier.json | 0 .../executeafm/response/attributeHeader.json | 0 .../response/attributeHeaderFull.json | 0 .../response/attributeInHeader.json | 0 .../response/executionResponse.json | 0 .../response/measureGroupHeader.json | 0 .../response/measureHeaderItem.json | 0 .../response/measureHeaderItemFull.json | 0 .../executeafm/response/resultDimension.json | 0 .../executeafm/response/totalHeaderItem.json | 0 .../result/attributeHeaderItem.json | 0 .../executeafm/result/executionResult.json | 0 .../result/executionResultFull.json | 0 .../resources/executeafm/result/paging.json | 0 .../result/resultMeasureHeaderItem.json | 0 .../result/resultTotalHeaderItem.json | 0 .../resources/executeafm/result/warning.json | 0 .../resultspec/attributeLocatorItem.json | 0 .../resultspec/attributeSortItem.json | 0 .../attributeSortItemWithAggregation.json | 0 .../executeafm/resultspec/dimension.json | 0 .../executeafm/resultspec/dimensionFull.json | 0 .../resultspec/measureLocatorItem.json | 0 .../resultspec/measureSortItem.json | 0 .../executeafm/resultspec/resultSpec.json | 0 .../executeafm/resultspec/totalItem.json | 0 .../resultspec/totalLocatorItem.json | 0 .../resources/executeafm/uriObjQualifier.json | 0 .../executeafm/visualizationExecution.json | 0 .../visualizationExecutionFull.json | 0 .../export/client-export-simple.json | 0 .../test/resources/export/client-export.json | 0 .../resources/featureflag/featureFlags.json | 0 .../featureflag/projectFeatureFlags.json | 0 .../src}/test/resources/gdc/asyncTask.json | 0 .../src}/test/resources/gdc/gdc.json | 0 .../src}/test/resources/gdc/linkEntries.json | 0 .../src}/test/resources/gdc/task-status.json | 0 .../src}/test/resources/gdc/uriResponse.json | 0 .../src}/test/resources/lcm/lcmEntities.json | 0 .../test/resources/lcm/lcmEntitiesEmpty.json | 0 .../src}/test/resources/lcm/lcmEntity.json | 0 .../test/resources/lcm/lcmEntityFull.json | 0 .../test/resources/md/attribute-input.json | 0 .../resources/md/attribute-inputOrig.json | 0 .../test/resources/md/attribute-sortDf.json | 0 .../src}/test/resources/md/attribute.json | 0 .../md/attributeDisplayForm-input.json | 0 .../md/attributeDisplayForm-inputOrig.json | 0 .../resources/md/attributeDisplayForm.json | 0 .../test/resources/md/attributeElement.json | 0 .../test/resources/md/attributeElements.json | 0 .../src}/test/resources/md/attributeSort.json | 0 .../src}/test/resources/md/column.json | 0 .../test/resources/md/dataLoadingColumn.json | 0 .../src}/test/resources/md/dataset-input.json | 0 .../src}/test/resources/md/dataset.json | 0 .../test/resources/md/dimension-input.json | 0 .../src}/test/resources/md/dimension.json | 0 .../test/resources/md/dimensionAttribute.json | 0 .../test/resources/md/displayForm-input.json | 0 .../src}/test/resources/md/displayForm.json | 0 .../src}/test/resources/md/entry.json | 0 .../src}/test/resources/md/fact-input.json | 0 .../src}/test/resources/md/fact.json | 0 .../md/maintenance/partialMDArtifact.json | 0 .../partialMDExport-defaultVals.json | 0 .../md/maintenance/partialMDExport.json | 0 .../md/maintenance/partialMDImport.json | 0 .../test/resources/md/meta-withFlags.json | 0 .../src}/test/resources/md/meta.json | 0 .../src}/test/resources/md/metric-folder.json | 0 .../src}/test/resources/md/metric-links.json | 0 .../src}/test/resources/md/metric-new.json | 0 .../src}/test/resources/md/metric-out.json | 0 .../src}/test/resources/md/objCommon.json | 0 .../test/resources/md/projectDashboard.json | 0 .../resources/md/projectDashboardCreate.json | 0 .../src}/test/resources/md/query.json | 0 .../resources/md/report/attributeInGrid.json | 0 .../test/resources/md/report/grid-input.json | 0 .../src}/test/resources/md/report/grid.json | 0 .../resources/md/report/gridElements.json | 0 .../gridReportDefinitionContent-input.json | 0 .../report/gridReportDefinitionContent.json | 0 .../resources/md/report/metricElement.json | 0 .../oneNumberReportDefinition-input.json | 0 .../md/report/oneNumberReportDefinition.json | 0 ...neNumberReportDefinitionContent-input.json | 0 .../oneNumberReportDefinitionContent.json | 0 .../resources/md/report/report-input.json | 0 .../src}/test/resources/md/report/report.json | 0 .../src}/test/resources/md/scheduledMail.json | 0 .../src}/test/resources/md/table.json | 0 .../src}/test/resources/md/tableDataLoad.json | 0 .../md/visualization/attributeBucket.json | 0 .../visualization/barVisualizationClass.json | 0 .../complexVisualizationObject.json | 0 .../md/visualization/customChart.json | 0 .../emptyBucketsVisualization.json | 0 .../externalVisualizationClass.json | 0 .../resources/md/visualization/lineChart.json | 0 .../md/visualization/measureBucket.json | 0 .../md/visualization/mixedBucket.json | 0 ...multipleAttributeBucketsVisualization.json | 0 .../multipleAttributesBucket.json | 0 .../multipleMeasureBucketsVisualization.json | 0 .../visualization/multipleMeasuresBucket.json | 0 .../md/visualization/noItemsBucket.json | 0 .../md/visualization/segmentedLineChart.json | 0 .../md/visualization/simpleMeasure.json | 0 .../simpleVisualizationObject.json | 0 .../md/visualization/stackedColumnChart.json | 0 .../tableVisualizationClass.json | 0 .../visualization/visualizationAttribute.json | 0 .../visualizationAttributeFull.json | 0 .../model/maql-ddl-task-status-fail.json | 0 .../test/resources/model/maqlDdlLinks.json | 0 .../src}/test/resources/model/modelDiff.json | 0 .../test/resources/notification/channel.json | 0 .../notification/channelToCreate.json | 0 .../resources/notification/condition.json | 0 .../notification/emailConfiguration.json | 0 .../resources/notification/projectEvent.json | 0 .../resources/notification/subscription.json | 0 .../notification/subscriptionToCreate.json | 0 .../test/resources/notification/template.json | 0 .../resources/notification/timerEvent.json | 0 .../resources/project/addUsersToProject.json | 0 .../created-invitations-uris-only.json | 0 .../project/created-invitations.json | 0 .../test/resources/project/invitations.json | 0 .../test/resources/project/project-role.json | 0 .../test/resources/project/project-role2.json | 0 .../test/resources/project/project-role3.json | 0 .../test/resources/project/project-roles.json | 0 .../resources/project/project-template.json | 0 .../resources/project/project-templates.json | 0 .../test/resources/project/project-user.json | 0 .../test/resources/project/project-users.json | 0 .../resources/project/project-validate.json | 0 .../project/project-validationAvail.json | 0 .../project/project-validationResultItem.json | 0 .../project/project-validationResultLog.json | 0 .../project-validationResultParam.json | 0 .../project/project-validationResults.json | 0 .../resources/project/project-vertica.json | 0 .../src}/test/resources/project/project.json | 0 .../project/projectUsersUpdateResult.json | 0 .../resources/projecttemplate/template.json | 0 .../resources/report/executeDefinition.json | 0 .../test/resources/report/executeReport.json | 0 .../src}/test/resources/warehouse/schema.json | 0 .../test/resources/warehouse/schemas.json | 0 .../warehouse/user-createWithLogin.json | 0 .../warehouse/user-createWithProfile.json | 0 .../src}/test/resources/warehouse/user.json | 0 .../test/resources/warehouse/users-empty.json | 0 .../src}/test/resources/warehouse/users.json | 0 .../resources/warehouse/warehouse-create.json | 0 .../warehouse/warehouse-null-token.json | 0 .../warehouse/warehouse-withLicense.json | 0 .../test/resources/warehouse/warehouse.json | 0 .../warehouse/warehouseTask-finished.json | 0 .../warehouse/warehouseTask-poll.json | 0 .../resources/warehouse/warehouses-empty.json | 0 .../test/resources/warehouse/warehouses.json | 0 gooddata-java/pom.xml | 167 ++++++ .../sdk/service}/AbstractPollHandler.java | 6 +- .../sdk/service}/AbstractPollHandlerBase.java | 6 +- .../sdk/service}/AbstractService.java | 6 +- .../gooddata/sdk/service}/Authentication.java | 4 +- .../DeprecationWarningRequestInterceptor.java | 2 +- .../gooddata/sdk/service}/FutureResult.java | 6 +- .../com/gooddata/sdk/service}/GoodData.java | 51 +- .../sdk/service}/GoodDataEndpoint.java | 4 +- .../sdk/service}/GoodDataSettings.java | 4 +- .../HeaderSettingRequestInterceptor.java | 4 +- .../gooddata/sdk/service}/PollHandler.java | 7 +- .../com/gooddata/sdk/service}/PollResult.java | 4 +- .../sdk/service}/SimplePollHandler.java | 6 +- .../account/AccountNotFoundException.java | 4 +- .../sdk/service}/account/AccountService.java | 11 +- .../auditevent/AuditEventPageRequest.java | 4 +- .../auditevent/AuditEventService.java | 16 +- .../AuditEventsForbiddenException.java | 6 +- .../LoginPasswordAuthentication.java | 8 +- .../authentication/SstAuthentication.java | 8 +- .../connector/ConnectorException.java | 4 +- .../service}/connector/ConnectorService.java | 23 +- .../IntegrationNotFoundException.java | 7 +- .../service}/dataload/OutputStageService.java | 16 +- .../processes/ProcessExecutionException.java | 5 +- .../processes/ProcessNotFoundException.java | 4 +- .../dataload/processes/ProcessService.java | 31 +- .../processes/ScheduleExecutionException.java | 4 +- .../processes/ScheduleNotFoundException.java | 4 +- .../service}/dataset/DatasetException.java | 4 +- .../sdk/service}/dataset/DatasetService.java | 56 +- .../executeafm/ExecuteAfmService.java | 23 +- .../executeafm/ExecutionResultException.java | 7 +- .../sdk/service}/export/ExportException.java | 6 +- .../sdk/service}/export/ExportService.java | 40 +- .../export/NoDataExportException.java | 6 +- .../featureflag/FeatureFlagService.java | 26 +- .../sdk/service}/gdc/DataStoreException.java | 4 +- .../sdk/service}/gdc/DataStoreService.java | 10 +- .../gooddata/sdk/service}/gdc/GdcSardine.java | 4 +- .../gooddata/sdk/service}/gdc/GdcService.java | 10 +- .../sdk/service}/lcm/LcmEntityFilter.java | 5 +- .../gooddata/sdk/service}/lcm/LcmService.java | 12 +- .../sdk/service}/md/MetadataService.java | 35 +- .../service}/md/NonUniqueObjException.java | 5 +- .../sdk/service}/md/ObjCreateException.java | 5 +- .../sdk/service}/md/ObjNotFoundException.java | 5 +- .../sdk/service}/md/ObjUpdateException.java | 5 +- .../md/maintenance/ExportImportException.java | 4 +- .../md/maintenance/ExportImportService.java | 23 +- .../notification/NotificationService.java | 15 +- .../project/ProjectNotFoundException.java | 4 +- .../sdk/service}/project/ProjectService.java | 25 +- .../project/ProjectUsersUpdateException.java | 4 +- .../project/RoleNotFoundException.java | 4 +- .../UserInProjectNotFoundException.java | 4 +- .../project}/model/ModelException.java | 4 +- .../service/project}/model/ModelService.java | 35 +- .../ProjectTemplateService.java | 12 +- .../report/NoDataReportException.java | 8 +- .../sdk/service}/report/ReportException.java | 7 +- .../sdk/service}/report/ReportService.java | 26 +- .../service}/util/ResponseErrorHandler.java | 4 +- .../gooddata/sdk/service}/util/ZipHelper.java | 4 +- .../warehouse/WarehouseNotFoundException.java | 4 +- .../WarehouseSchemaNotFoundException.java | 4 +- .../service}/warehouse/WarehouseService.java | 15 +- .../WarehouseUserNotFoundException.java | 4 +- .../src}/main/javadoc/overview.html | 0 .../gooddata/sdk/service}/GoodDataIT.groovy | 4 +- .../sdk/service}/GoodDataITBase.groovy | 6 +- .../executeafm/ExecuteAfmServiceIT.groovy | 31 +- .../ExecutionResultExceptionTest.groovy | 5 +- .../service}/lcm/LcmEntityFilterTest.groovy | 4 +- .../sdk/service}/lcm/LcmServiceIT.groovy | 9 +- .../sdk/service}/AbstractGoodDataAT.java | 22 +- .../sdk/service}/AbstractGoodDataIT.java | 6 +- .../sdk/service}/AbstractServiceTest.java | 6 +- .../sdk/service}/GoodDataEndpointTest.java | 6 +- .../sdk/service}/GoodDataSettingsTest.java | 4 +- .../gooddata/sdk/service}/PollHandlerIT.java | 5 +- .../service}/account/AccountServiceAT.java | 7 +- .../service}/account/AccountServiceIT.java | 7 +- .../auditevent/AuditEventPageRequestTest.java | 6 +- .../auditevent/AuditEventServiceAT.java | 13 +- .../auditevent/AuditEventServiceIT.java | 18 +- .../auditevent/AuditEventServiceTest.java | 12 +- .../LoginPasswordAuthenticationTest.java | 6 +- .../authentication/SstAuthenticationTest.java | 6 +- .../connector/ConnectorServiceIT.java | 26 +- .../dataload/OutputStageServiceAT.java | 13 +- .../dataload/OutputStageServiceIT.java | 9 +- .../dataload/OutputStageServiceTest.java | 12 +- .../dataload/processes/ProcessIdMatcher.java | 5 +- .../dataload/processes/ProcessServiceAT.java | 30 +- .../dataload/processes/ProcessServiceIT.java | 11 +- .../processes/ProcessServiceTest.java | 55 +- .../dataload/processes/ScheduleIdMatcher.java | 5 +- .../service}/dataset/DatasetServiceAT.java | 9 +- .../service}/dataset/DatasetServiceIT.java | 13 +- .../service}/dataset/DatasetServiceTest.java | 115 ++-- .../executeafm/ExecuteAfmServiceAT.java | 50 +- .../sdk/service}/export/ExportServiceAT.java | 7 +- .../sdk/service}/export/ExportServiceIT.java | 20 +- .../service}/export/ExportServiceTest.java | 25 +- .../featureflag/FeatureFlagServiceAT.java | 19 +- .../featureflag/FeatureFlagServiceIT.java | 20 +- .../featureflag/FeatureFlagServiceTest.java | 20 +- .../sdk/service}/gdc/DataStoreServiceIT.java | 6 +- .../sdk/service}/gdc/DatastoreServiceAT.java | 24 +- .../sdk/service}/gdc/GdcServiceIT.java | 8 +- .../service}/md/ExportImportServiceAT.java | 22 +- .../sdk/service}/md/MetadataServiceAT.java | 29 +- .../sdk/service}/md/MetadataServiceIT.java | 37 +- .../sdk/service}/md/MetadataServiceTest.java | 115 ++-- .../md/maintenance/ExportImportServiceIT.java | 10 +- .../maintenance/ExportImportServiceTest.java | 13 +- .../notification/NotificationServiceAT.java | 9 +- .../notification/NotificationServiceIT.java | 11 +- .../notification/NotificationServiceTest.java | 15 +- .../service}/project/ProjectIdMatcher.java | 5 +- .../service}/project/ProjectServiceAT.java | 18 +- .../service}/project/ProjectServiceIT.java | 16 +- .../service}/project/ProjectServiceTest.java | 13 +- .../project}/model/ModelServiceAT.java | 7 +- .../project}/model/ModelServiceIT.java | 33 +- .../ProjectTemplateServiceIT.java | 10 +- .../service}/report/ReportServiceTest.java | 17 +- .../spring/GoodDataBeansAsServicesIT.java | 17 +- .../util/ResponseErrorHandlerTest.java | 5 +- .../sdk/service}/util/ZipHelperTest.java | 4 +- .../warehouse/WarehouseIdMatcher.java | 5 +- .../warehouse/WarehouseServiceAT.java | 19 +- .../warehouse/WarehouseServiceIT.java | 9 +- .../test/resources/account/account-input.json | 7 + .../src/test/resources/account/account.json | 22 + .../account/create-account-response.json | 0 .../resources/account/create-account.json | 10 + .../resources/account/update-account.json | 0 .../resources/auditevents/auditEvent.json | 11 + .../auditevents/auditEventWithParam.json | 14 + .../auditEventWithParamAndLink.json | 17 + .../resources/auditevents/auditEvents.json | 34 ++ .../auditevents/auditEventsPage2.json | 0 .../auditevents/emptyAuditEvents.json | 11 + .../auditevents/userAuditEvents.json | 23 + .../src}/test/resources/city.csv | 0 .../resources/connector/coupa_instance.json | 7 + .../connector/coupa_instances-empty.json | 0 .../resources/connector/coupa_instances.json | 15 + .../resources/connector/integration-in.json | 6 + .../integration-scheduled-process.json | 0 .../test/resources/connector/integration.json | 37 ++ .../process-execution-coupa-downloadDate.json | 5 + .../connector/process-execution-empty.json | 3 + .../process-execution-incremental.json | 5 + .../process-execution-pardot-changesFrom.json | 5 + .../process-execution-zendesk4-download.json | 9 + .../process-execution-zendesk4-startDate.json | 6 + .../connector/process-status-embedded.json | 12 + .../connector/process-status-error.json | 14 + .../connector/process-status-finished.json | 0 .../connector/process-status-scheduled.json | 0 .../resources/connector/settings-coupa.json | 5 + .../resources/connector/settings-pardot.json | 5 + .../settings-zendesk4-before-template26.json | 8 + .../connector/settings-zendesk4.json | 10 + .../src}/test/resources/corruptedPerson.csv | 0 .../test/resources/dataload/outputStage.json | 8 + .../dataload/outputStageAllFields.json | 12 + .../dataload/outputStageNoProcess.json | 11 + .../dataload/processes/appstoreProcess.json | 0 .../dataload/processes/asyncTask.json | 0 .../processes/emptyScheduleExecution.json | 4 + .../dataload/processes/execution.json | 13 + .../processes/executionDetail-success.json | 0 .../dataload/processes/executionDetail.json | 20 + .../dataload/processes/executionTask.json | 8 + .../processes/process-input-withPath.json | 7 + .../dataload/processes/process-input.json | 6 + .../resources/dataload/processes/process.json | 13 + .../processes/processWithoutData.json | 0 .../dataload/processes/processes.json | 17 + .../dataload/processes/schedule-disabled.json | 0 .../processes/schedule-input-all-fields.json | 13 + .../dataload/processes/schedule-input.json | 11 + .../processes/schedule-triggered-input.json | 11 + .../processes/schedule-triggered.json | 18 + .../dataload/processes/schedule.json | 44 ++ .../dataload/processes/scheduleExecution.json | 11 + .../dataload/processes/schedules.json | 53 ++ .../dataload/processes/schedules_page1.json | 54 ++ .../dataload/processes/schedules_page2.json | 0 .../dataload/processes/testgraph/invalid.grf | 0 .../dataload/processes/testgraph/sdktest.grf | 0 .../processes/testgraph/workspace.prm | 0 .../src/test/resources/dataset/dataset.json | 7 + .../test/resources/dataset/datasetLinks.json | 16 + .../dataset/datasetManifest-input.json | 19 + .../resources/dataset/datasetManifest.json | 33 ++ .../src/test/resources/dataset/maqlDml.json | 1 + .../src/test/resources/dataset/pull.json | 3 + .../src/test/resources/dataset/pullTask.json | 7 + .../dataset/pullTaskStatusError.json | 0 .../resources/dataset/pullTaskStatusOk.json | 0 .../dataset/pullTaskStatusRunning.json | 0 .../test/resources/dataset/taskStateOK.json | 6 + .../resources/dataset/uploads/data-sets.json | 54 ++ .../dataset/uploads/data-uploads-info.json | 9 + .../resources/dataset/uploads/upload.json | 14 + .../resources/dataset/uploads/uploads.json | 34 ++ .../executeafm/afm/absoluteDateFilter.json | 9 + .../test/resources/executeafm/afm/afm.json | 38 ++ .../afm/arithmeticMeasureDefinition.json | 6 + .../executeafm/afm/attributeItem.json | 6 + .../executeafm/afm/attributeItemFull.json | 7 + .../executeafm/afm/expressionFilter.json | 5 + .../resources/executeafm/afm/measureItem.json | 10 + .../executeafm/afm/measureItemFull.json | 12 + .../executeafm/afm/nativeTotalItem.json | 7 + .../afm/negativeAttributeFilter.json | 8 + .../afm/overPeriodDateAttribute.json | 6 + .../afm/overPeriodMeasureDefinition.json | 13 + ...iodMeasureDefinitionWithTwoAttributes.json | 19 + .../executeafm/afm/popMeasureDefinition.json | 8 + .../afm/positiveAttributeFilter.json | 8 + .../afm/previousPeriodDateDataSet.json | 6 + .../afm/previousPeriodMeasureDefinition.json | 13 + ...eriodMeasureDefinitionWithTwoDataSets.json | 19 + .../executeafm/afm/relativeDateFilter.json | 10 + .../afm/simpleMeasureDefinition.json | 7 + .../afm/simpleMeasureDefinitionFull.json | 31 ++ .../src/test/resources/executeafm/empty.json | 1 + .../test/resources/executeafm/execution.json | 42 ++ .../resources/executeafm/executionFull.json | 84 +++ .../executeafm/identifierObjQualifier.json | 3 + .../executeafm/response/attributeHeader.json | 13 + .../response/attributeHeaderFull.json | 20 + .../response/attributeInHeader.json | 5 + .../response/executionResponse.json | 63 +++ .../response/measureGroupHeader.json | 13 + .../response/measureHeaderItem.json | 7 + .../response/measureHeaderItemFull.json | 9 + .../executeafm/response/resultDimension.json | 30 ++ .../executeafm/response/totalHeaderItem.json | 5 + .../result/attributeHeaderItem.json | 6 + .../executeafm/result/executionResult.json | 29 ++ .../result/executionResultFull.json | 89 ++++ .../resources/executeafm/result/paging.json | 11 + .../result/resultMeasureHeaderItem.json | 6 + .../result/resultTotalHeaderItem.json | 6 + .../resources/executeafm/result/warning.json | 5 + .../resultspec/attributeLocatorItem.json | 6 + .../resultspec/attributeSortItem.json | 6 + .../attributeSortItemWithAggregation.json | 7 + .../executeafm/resultspec/dimension.json | 6 + .../executeafm/resultspec/dimensionFull.json | 13 + .../resultspec/measureLocatorItem.json | 5 + .../resultspec/measureSortItem.json | 18 + .../executeafm/resultspec/resultSpec.json | 36 ++ .../executeafm/resultspec/totalItem.json | 5 + .../resultspec/totalLocatorItem.json | 6 + .../resources/executeafm/uriObjQualifier.json | 3 + .../executeafm/visualizationExecution.json | 5 + .../visualizationExecutionFull.json | 36 ++ .../src}/test/resources/export/asynctask.json | 0 .../export/client-export-simple.json | 6 + .../test/resources/export/client-export.json | 6 + .../resources/featureflag/featureFlags.json | 6 + .../featureflag/projectFeatureFlag.json | 0 .../featureflag/projectFeatureFlags.json | 29 ++ .../src/test/resources/gdc/asyncTask.json | 7 + .../test/resources/gdc/errorStructure.json | 0 gooddata-java/src/test/resources/gdc/gdc.json | 86 +++ .../src}/test/resources/gdc/gdcError.json | 0 .../src}/test/resources/gdc/invalidError.json | 0 .../src/test/resources/gdc/linkEntries.json | 8 + .../src/test/resources/gdc/task-status.json | 6 + .../src/test/resources/gdc/uriResponse.json | 3 + .../src/test/resources/lcm/lcmEntities.json | 15 + .../test/resources/lcm/lcmEntitiesEmpty.json | 7 + .../src/test/resources/lcm/lcmEntity.json | 7 + .../src/test/resources/lcm/lcmEntityFull.json | 13 + .../src}/test/resources/log4j.properties | 0 .../test/resources/md/attribute-input.json | 22 + .../resources/md/attribute-inputOrig.json | 67 +++ .../test/resources/md/attribute-sortDf.json | 71 +++ .../src/test/resources/md/attribute.json | 67 +++ .../md/attributeDisplayForm-input.json | 17 + .../md/attributeDisplayForm-inputOrig.json | 27 + .../resources/md/attributeDisplayForm.json | 27 + .../test/resources/md/attributeElement.json | 4 + .../resources/md/attributeElements-empty.json | 16 + .../test/resources/md/attributeElements.json | 25 + .../src/test/resources/md/attributeSort.json | 5 + .../src}/test/resources/md/bulk-get.json | 0 .../src/test/resources/md/column.json | 23 + .../test/resources/md/dataLoadingColumn.json | 34 ++ .../src/test/resources/md/dataset-input.json | 14 + .../src/test/resources/md/dataset.json | 36 ++ .../test/resources/md/dimension-input.json | 10 + .../src/test/resources/md/dimension.json | 139 +++++ .../test/resources/md/dimensionAttribute.json | 59 +++ .../test/resources/md/displayForm-input.json | 13 + .../src/test/resources/md/displayForm.json | 23 + .../src/test/resources/md/entry.json | 15 + .../src/test/resources/md/fact-input.json | 18 + gooddata-java/src/test/resources/md/fact.json | 29 ++ .../test/resources/md/identifierToUri.json | 0 .../test/resources/md/identifiersAndUris.json | 0 .../partial-export-task-status-fail.json | 0 .../partial-import-task-status-fail.json | 0 .../md/maintenance/partialMDArtifact.json | 8 + .../partialMDExport-defaultVals.json | 8 + .../md/maintenance/partialMDExport.json | 10 + .../md/maintenance/partialMDImport.json | 8 + gooddata-java/src/test/resources/md/meta.json | 17 + .../test/resources/md/metric-created.json | 0 .../src/test/resources/md/metric-folder.json | 95 ++++ .../src}/test/resources/md/metric-input.json | 0 .../src/test/resources/md/metric-links.json | 61 +++ .../src/test/resources/md/metric-new.json | 11 + .../src/test/resources/md/metric-out.json | 58 +++ .../src}/test/resources/md/metric.json | 0 .../src/test/resources/md/objCommon.json | 17 + .../test/resources/md/projectDashboard.json | 110 ++++ .../resources/md/projectDashboardCreate.json | 16 + .../src/test/resources/md/query.json | 35 ++ .../resources/md/report/attributeInGrid.json | 7 + .../test/resources/md/report/grid-input.json | 29 ++ .../src/test/resources/md/report/grid.json | 38 ++ .../resources/md/report/gridElements.json | 10 + .../md/report/gridReportDefinition.json | 0 .../gridReportDefinitionContent-input.json | 14 + .../report/gridReportDefinitionContent.json | 31 ++ .../resources/md/report/metricElement.json | 6 + .../oneNumberReportDefinition-input.json | 26 + .../md/report/oneNumberReportDefinition.json | 44 ++ ...neNumberReportDefinitionContent-input.json | 19 + .../oneNumberReportDefinitionContent.json | 53 ++ .../resources/md/report/report-input.json | 13 + .../src/test/resources/md/report/report.json | 25 + .../src/test/resources/md/scheduledMail.json | 58 +++ .../src/test/resources/md/table.json | 26 + .../src/test/resources/md/tableDataLoad.json | 22 + .../md/visualization/attributeBucket.json | 14 + .../visualization/barVisualizationClass.json | 14 + .../complexVisualizationObject.json | 132 +++++ .../md/visualization/customChart.json | 48 ++ .../emptyBucketsVisualization.json | 16 + .../externalVisualizationClass.json | 14 + .../resources/md/visualization/lineChart.json | 52 ++ .../md/visualization/measureBucket.json | 22 + .../md/visualization/mixedBucket.json | 30 ++ ...multipleAttributeBucketsVisualization.json | 52 ++ .../multipleAttributesBucket.json | 22 + .../multipleMeasureBucketsVisualization.json | 73 +++ .../visualization/multipleMeasuresBucket.json | 52 ++ .../md/visualization/noItemsBucket.json | 4 + .../md/visualization/segmentedLineChart.json | 66 +++ .../md/visualization/simpleMeasure.json | 12 + .../simpleVisualizationObject.json | 13 + .../md/visualization/stackedColumnChart.json | 66 +++ .../tableVisualizationClass.json | 14 + .../visualization/visualizationAttribute.json | 8 + .../visualizationAttributeFull.json | 9 + .../model/maql-ddl-task-status-fail.json | 17 + .../test/resources/model/maqlDdlLinks.json | 8 + .../src/test/resources/model/modelDiff.json | 31 ++ .../test/resources/notification/channel.json | 17 + .../notification/channelToCreate.json | 12 + .../resources/notification/condition.json | 5 + .../notification/emailConfiguration.json | 5 + .../test/resources/notification/meta.json | 0 .../resources/notification/metaToCreate.json | 0 .../resources/notification/projectEvent.json | 8 + .../resources/notification/subscription.json | 37 ++ .../notification/subscriptionToCreate.json | 32 ++ .../test/resources/notification/template.json | 5 + .../resources/notification/timerEvent.json | 5 + .../src}/test/resources/person.csv | 0 .../src}/test/resources/person.json | 0 .../resources/project/addUserRequest.json | 0 .../resources/project/addUsersToProject.json | 17 + .../created-invitations-uris-only.json | 8 + .../project/created-invitations.json | 16 + .../project/disableUserInProject.json | 0 .../test/resources/project/invitations.json | 11 + .../resources/project/project-deleted.json | 0 .../resources/project/project-loading.json | 0 .../test/resources/project/project-role.json | 89 ++++ .../test/resources/project/project-role2.json | 89 ++++ .../test/resources/project/project-role3.json | 89 ++++ .../test/resources/project/project-roles.json | 11 + .../resources/project/project-template.json | 5 + .../resources/project/project-templates.json | 9 + .../test/resources/project/project-user.json | 30 ++ .../project/project-users-empty.json | 0 .../test/resources/project/project-users.json | 34 ++ .../resources/project/project-validate.json | 11 + .../project/project-validationAvail.json | 11 + .../project/project-validationResultItem.json | 164 ++++++ .../project/project-validationResultLog.json | 52 ++ .../project-validationResultParam.json | 23 + .../project/project-validationResults.json | 492 ++++++++++++++++++ .../resources/project/project-vertica.json | 39 ++ .../src/test/resources/project/project.json | 40 ++ .../project/projectUsersUpdateResult.json | 8 + .../project/projectUsersUpdateResultFail.json | 0 .../resources/projecttemplate/template.json | 26 + .../resources/projecttemplate/templates.json | 0 .../resources/report/executeDefinition.json | 5 + .../test/resources/report/executeReport.json | 5 + .../resources/spring/gd-annotationConfig.xml | 2 +- .../warehouse/removeUserTask-finished.json | 0 .../src/test/resources/warehouse/schema.json | 11 + .../src/test/resources/warehouse/schemas.json | 20 + .../warehouse/user-createWithLogin.json | 6 + .../warehouse/user-createWithProfile.json | 6 + .../warehouse/user-withoutLogin.json | 0 .../src/test/resources/warehouse/user.json | 11 + .../test/resources/warehouse/users-empty.json | 7 + .../warehouse/users-with-next-page-link.json | 0 .../src/test/resources/warehouse/users.json | 31 ++ .../resources/warehouse/warehouse-create.json | 8 + .../warehouse/warehouse-null-token.json | 19 + .../warehouse/warehouse-withLicense.json | 21 + .../test/resources/warehouse/warehouse.json | 20 + .../warehouse/warehouseTask-finished.json | 9 + .../warehouse/warehouseTask-poll.json | 7 + .../resources/warehouse/warehouses-empty.json | 7 + .../test/resources/warehouse/warehouses.json | 46 ++ pom.xml | 413 ++++++++------- release.sh | 2 +- 1145 files changed, 8807 insertions(+), 2435 deletions(-) create mode 100644 gooddata-java-model/pom.xml rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/account/Account.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/auditevent/AuditEvent.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/auditevent/AuditEvents.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/auditevent/AuditEventsDeserializer.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/auditevent/AuditEventsSerializer.java (76%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/ConnectorType.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/CoupaInstance.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/CoupaInstances.java (69%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/CoupaProcessExecution.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/CoupaSettings.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/Integration.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/IntegrationProcessStatus.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/PardotProcessExecution.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/PardotSettings.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/ProcessExecution.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/ProcessStatus.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/Settings.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/Status.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/Zendesk4ProcessExecution.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/connector/Zendesk4Settings.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/OutputStage.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/AsyncTask.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/DataloadProcess.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/DataloadProcesses.java (85%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/ProcessExecution.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/ProcessExecutionDetail.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/ProcessExecutionTask.java (85%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/ProcessType.java (75%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/Schedule.java (98%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/ScheduleExecution.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/ScheduleState.java (67%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/Schedules.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataload/processes/SchedulesDeserializer.java (84%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/Dataset.java (72%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/DatasetLinks.java (75%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/DatasetManifest.java (98%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/DatasetManifests.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/DatasetNotFoundException.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/Datasets.java (76%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/EtlMode.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/EtlModeType.java (72%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/LookupMode.java (73%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/MaqlDml.java (64%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/Pull.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/PullTask.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/TaskState.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/Upload.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/UploadMode.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/UploadStatistics.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/Uploads.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/dataset/UploadsInfo.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/Execution.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/IdentifierObjQualifier.java (76%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/ObjQualifier.java (68%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/ResultPage.java (79%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/UriObjQualifier.java (75%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/VisualizationExecution.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/AbsoluteDateFilter.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/Afm.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/Aggregation.java (80%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/ArithmeticMeasureDefinition.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/AttributeFilter.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/AttributeItem.java (84%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/CompatibilityFilter.java (84%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/DateFilter.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/DerivedMeasureDefinition.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/ExpressionFilter.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/FilterItem.java (77%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/LocallyIdentifiable.java (78%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/MeasureDefinition.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/MeasureItem.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/NativeTotalItem.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/NegativeAttributeFilter.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/ObjIdentifierUtilities.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/ObjQualifierConverter.java (63%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/OverPeriodDateAttribute.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/OverPeriodMeasureDefinition.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/PopMeasureDefinition.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/PositiveAttributeFilter.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/PreviousPeriodDateDataSet.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/PreviousPeriodMeasureDefinition.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/RelativeDateFilter.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/afm/SimpleMeasureDefinition.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/AttributeHeader.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/AttributeInHeader.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/ExecutionResponse.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/Header.java (79%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/MeasureGroupHeader.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/MeasureHeaderItem.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/ResultDimension.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/response/TotalHeaderItem.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/AttributeHeaderItem.java (77%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/Data.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/DataList.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/DataValue.java (77%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/ExecutionResult.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/Paging.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/ResultHeaderItem.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/ResultMeasureHeaderItem.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/ResultTotalHeaderItem.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/result/Warning.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/AttributeLocatorItem.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/AttributeSortAggregation.java (82%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/AttributeSortItem.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/Dimension.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/Direction.java (74%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/LocatorItem.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/MeasureLocatorItem.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/MeasureSortItem.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/ResultSpec.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/SortItem.java (84%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/TotalItem.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/executeafm/resultspec/TotalLocatorItem.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/export/ClientExport.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/export/ExecuteReport.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/export/ExecuteReportDefinition.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/export/ExportFormat.java (84%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/export/ReportRequest.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/featureflag/FeatureFlag.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/featureflag/FeatureFlags.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/featureflag/ProjectFeatureFlag.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/featureflag/ProjectFeatureFlags.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/AboutLinks.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/AbstractMaql.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/AsyncTask.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/Gdc.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/LinkEntries.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/RootLinks.java (99%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/TaskStatus.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/gdc/UriResponse.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/lcm/LcmEntities.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/lcm/LcmEntity.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/AbstractObj.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Attachment.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Attribute.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/AttributeDisplayForm.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/AttributeElement.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/AttributeElements.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/AttributeSort.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/BulkGet.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/BulkGetUris.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Column.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/DashboardAttachment.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/DataLoadingColumn.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Dataset.java (98%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Dimension.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/DisplayForm.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Entry.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Expression.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Fact.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/IdentifierAndUri.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/IdentifierToUri.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/IdentifiersAndUris.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/InUseMany.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Key.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/MaqlAst.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Meta.java (98%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Metric.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/NestedAttribute.java (98%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Obj.java (82%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/ProjectDashboard.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Query.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Queryable.java (76%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/ReportAttachment.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Restriction.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/ScheduledMail.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/ScheduledMailWhen.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Table.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/TableDataLoad.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Updatable.java (76%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/Usage.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/UseMany.java (82%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/UseManyEntries.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/maintenance/PartialMdArtifact.java (85%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/maintenance/PartialMdExport.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/maintenance/PartialMdExportToken.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/AttributeInGrid.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/Filter.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/Grid.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/GridElement.java (74%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/GridElementDeserializer.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/GridElementSerializer.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/GridReportDefinitionContent.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/MetricElement.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/MetricGroup.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/OneNumberReportDefinitionContent.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/Report.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/ReportDefinition.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/ReportDefinitionContent.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/report/Total.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/Bucket.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/BucketItem.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/CollectionType.java (77%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/Measure.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VOPopMeasureDefinition.java (71%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VOSimpleMeasureDefinition.java (69%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VisualizationAttribute.java (89%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VisualizationClass.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VisualizationConverter.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VisualizationObject.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/md/visualization/VisualizationType.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/Channel.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/Configuration.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/EmailConfiguration.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/MessageTemplate.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/ProjectEvent.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/Subscription.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/TimerEvent.java (91%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/Trigger.java (82%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/notification/TriggerCondition.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/CreatedInvitations.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Environment.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Invitation.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Invitations.java (73%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Project.java (99%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectDriver.java (82%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectEnvironment.java (80%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectTemplate.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectTemplates.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectUsersUpdateResult.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResult.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResultGdcTimeElParam.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResultItem.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResultObjectParam.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResultParam.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResultSliElParam.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResultStringParam.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationResults.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidationType.java (94%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/ProjectValidations.java (83%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Projects.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Role.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Roles.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/User.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/Users.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/UsersDeserializer.java (85%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/project/UsersSerializer.java (90%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model/project}/model/DiffRequest.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model/project}/model/MaqlDdl.java (63%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model/project}/model/MaqlDdlLinks.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model/project}/model/ModelDiff.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/projecttemplate/Template.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/projecttemplate/Templates.java (74%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/report/ReportExportFormat.java (81%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/util/TagsDeserializer.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/util/TagsSerializer.java (88%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/Warehouse.java (97%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseSchema.java (95%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseSchemas.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseSchemasDeserializer.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseTask.java (85%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseUser.java (96%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseUserRole.java (82%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseUsers.java (93%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseUsersDeserializer.java (87%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehouseUsersSerializer.java (67%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/Warehouses.java (92%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehousesDeserializer.java (86%) rename {src/main/java/com/gooddata => gooddata-java-model/src/main/java/com/gooddata/sdk/model}/warehouse/WarehousesSerializer.java (67%) rename {src => gooddata-java-model/src}/main/resources/GoodDataApiVersion (100%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/ExecutionTest.groovy (74%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/IdentifierObjQualifierTest.groovy (93%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/ObjQualifierTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/ResultPageTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/UriObjQualifierTest.groovy (93%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/VisualizationExecutionTest.groovy (80%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/AbsoluteDateFilterTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/AfmTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/ArithmeticMeasureDefinitionTest.groovy (93%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/AttributeItemTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/CompatibilityFilterTest.groovy (88%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/ExpressionFilterTest.groovy (91%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/FilterItemTest.groovy (87%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/MeasureDefinitionTest.groovy (91%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/MeasureItemTest.groovy (94%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/NativeTotalItemTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/NegativeAttributeFilterTest.groovy (87%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/ObjIdentifierUtilitiesTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/OverPeriodDateAttributeTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/OverPeriodMeasureDefinitionTest.groovy (96%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/PopMeasureDefinitionTest.groovy (94%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/PositiveAttributeFilterTest.groovy (87%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/PreviousPeriodDateDataSetTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/PreviousPeriodMeasureDefinitionTest.groovy (96%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/RelativeDateFilterTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/afm/SimpleMeasureDefinitionTest.groovy (96%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/AttributeHeaderTest.groovy (95%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/AttributeInHeaderTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/ExecutionResponseTest.groovy (96%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/HeaderTest.groovy (85%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/MeasureGroupHeaderTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/MeasureHeaderItemTest.groovy (94%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/ResultDimensionTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/response/TotalHeaderItemTest.groovy (85%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/AttributeHeaderItemTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/DataListTest.groovy (94%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/DataTest.groovy (80%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/DataValueTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/ExecutionResultTest.groovy (97%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/PagingTest.groovy (91%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/ResultHeaderItemTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/ResultMeasureHeaderItemTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/ResultTotalHeaderItemTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/result/WarningTest.groovy (91%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/AttributeLocatorItemTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/AttributeSortItemTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/DimensionTest.groovy (92%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/MeasureLocatorItemTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/MeasureSortItemTest.groovy (90%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/ResultSpecTest.groovy (95%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/TotalItemTest.groovy (88%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/executeafm/resultspec/TotalLocatorItemTest.groovy (89%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/lcm/LcmEntitiesTest.groovy (93%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/lcm/LcmEntityTest.groovy (96%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/report/TotalTest.groovy (67%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/visualization/BucketTest.groovy (93%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/visualization/MeasureTest.groovy (93%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/visualization/VisualizationAttributeTest.groovy (88%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/visualization/VisualizationClassTest.groovy (94%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/visualization/VisualizationConverterTest.groovy (88%) rename {src/test/groovy/com/gooddata => gooddata-java-model/src/test/groovy/com/gooddata/sdk/model}/md/visualization/VisualizationObjectTest.groovy (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/account/AccountTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/auditevent/AuditEventTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/auditevent/AuditEventsTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/CoupaInstanceTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/CoupaInstancesTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/CoupaProcessExecutionTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/CoupaSettingsTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/IntegrationProcessStatusTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/IntegrationTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/PardotProcessExecutionTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/PardotSettingsTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/ProcessExecutionTest.java (78%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/ProcessStatusTest.java (88%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/StatusTest.java (84%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/Zendesk4ProcessExecutionTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/connector/Zendesk4SettingsTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/OutputStageTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/DataloadProcessTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/DataloadProcessesTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/ProcessExecutionDetailTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/ProcessExecutionTaskTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/ProcessExecutionTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/ScheduleExecutionTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/ScheduleTest.java (98%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataload/processes/SchedulesTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/DatasetLinksTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/DatasetManifestTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/DatasetTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/DatasetsTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/MaqlDmlTest.java (83%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/PullTaskTest.java (86%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/PullTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/TaskStateTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/UploadStatisticsTest.java (88%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/UploadTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/UploadsInfoTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/dataset/UploadsTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/export/ClientExportTest.java (74%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/export/ExecuteReportDefinitionTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/export/ExecuteReportTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/export/ExportFormatTest.java (72%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/featureflag/FeatureFlagTest.java (80%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/featureflag/FeatureFlagsTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/featureflag/ProjectFeatureFlagTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/featureflag/ProjectFeatureFlagsTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/AboutLinksTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/AsyncTaskTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/GdcTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/LinkEntriesTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/RootLinksTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/TaskStatusTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/gdc/UriResponseTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/AttachmentTest.java (82%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/AttributeDisplayFormTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/AttributeElementTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/AttributeElementsTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/AttributeSortTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/AttributeTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/BulkGetUrisTest.java (83%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ColumnTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/DashboardAttachmentTest.java (82%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/DataLoadingColumnTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/DatasetTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/DimensionTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/DisplayFormTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/EntryTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ExpressionTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/FactTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/IdentifierToUriTest.java (83%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/InUseManyTest.java (81%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/KeyTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/MetaTest.java (98%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/MetricTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/NestedAttributeTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ObjTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ProjectDashboardTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/QueryTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ReportAttachmentTest.java (69%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/RestrictionTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ScheduledMailTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/ScheduledMailWhenTest.java (84%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/TableDataLoadTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/TableTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/maintenance/PartialMdArtifactTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/maintenance/PartialMdExportTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/maintenance/PartialMdExportTokenTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/AttributeInGridTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/GridElementDeserializerTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/GridElementSerializerTest.java (84%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/GridReportDefinitionContentTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/GridTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/MetricElementTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/OneNumberReportDefinitionContentTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/ReportDefinitionContentTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/ReportDefinitionTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/md/report/ReportTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/ChannelTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/ConditionTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/EmailConfigurationTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/MessageTemplateTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/ProjectEventTest.java (91%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/SubscriptionTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/notification/TimerEventTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/CreatedInvitationsTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/InvitationsTest.java (86%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectTemplateTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectTemplatesTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectTest.java (98%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectUsersUpdateResultTest.java (88%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultGdcTimeElParamTest.java (82%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultItemTest.java (88%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultObjectParamTest.java (82%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultParamTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultSliElParamTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultStringParamTest.java (82%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationResultsTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationTypeTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/ProjectValidationsTest.java (88%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/RoleTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/RolesTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/UserTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/project/UsersTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model/project}/model/DiffRequestTest.java (85%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model/project}/model/MaqlDdlLinksTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model/project}/model/MaqlDdlTest.java (84%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model/project}/model/ModelDiffTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/projecttemplate/TemplateTest.java (95%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/report/ReportExportFormatTest.java (77%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/util/TagsDeserializerTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/util/TagsSerializerTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/util/TagsTestClass.java (88%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehouseSchemaTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehouseSchemasTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehouseTaskTest.java (92%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehouseTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehouseUserTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehouseUsersTest.java (94%) rename {src/test/java/com/gooddata => gooddata-java-model/src/test/java/com/gooddata/sdk/model}/warehouse/WarehousesTest.java (94%) rename {src => gooddata-java-model/src}/test/resources/account/account-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/account/account.json (100%) rename {src => gooddata-java-model/src}/test/resources/account/create-account.json (100%) rename {src => gooddata-java-model/src}/test/resources/auditevents/auditEvent.json (100%) rename {src => gooddata-java-model/src}/test/resources/auditevents/auditEventWithParam.json (100%) rename {src => gooddata-java-model/src}/test/resources/auditevents/auditEventWithParamAndLink.json (100%) rename {src => gooddata-java-model/src}/test/resources/auditevents/auditEvents.json (100%) rename {src => gooddata-java-model/src}/test/resources/auditevents/emptyAuditEvents.json (100%) rename {src => gooddata-java-model/src}/test/resources/auditevents/userAuditEvents.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/coupa_instance.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/coupa_instances.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/integration-in.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/integration.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-coupa-downloadDate.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-empty.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-incremental.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-pardot-changesFrom.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-reload.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-zendesk4-download.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-execution-zendesk4-startDate.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-status-embedded.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/process-status-error.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/settings-coupa.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/settings-pardot.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/settings-zendesk4-before-template26.json (100%) rename {src => gooddata-java-model/src}/test/resources/connector/settings-zendesk4.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/outputStage.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/outputStageAllFields.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/outputStageNoProcess.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/emptyScheduleExecution.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/execution.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/executionDetail.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/executionTask.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/process-input-withPath.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/process-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/process.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/processes.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedule-input-all-fields.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedule-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedule-triggered-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedule-triggered.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedule.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/scheduleExecution.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedules.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataload/processes/schedules_page1.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/dataset.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/datasetLinks.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/datasetManifest-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/datasetManifest.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/maqlDml.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/pull.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/pullTask.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/taskStateOK.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/uploads/data-sets.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/uploads/data-uploads-info.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/uploads/upload.json (100%) rename {src => gooddata-java-model/src}/test/resources/dataset/uploads/uploads.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/absoluteDateFilter.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/afm.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/arithmeticMeasureDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/attributeItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/attributeItemFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/expressionFilter.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/measureItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/measureItemFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/nativeTotalItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/negativeAttributeFilter.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/overPeriodDateAttribute.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/overPeriodMeasureDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/overPeriodMeasureDefinitionWithTwoAttributes.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/popMeasureDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/positiveAttributeFilter.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/previousPeriodDateDataSet.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/previousPeriodMeasureDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/previousPeriodMeasureDefinitionWithTwoDataSets.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/relativeDateFilter.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/simpleMeasureDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/afm/simpleMeasureDefinitionFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/empty.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/execution.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/executionFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/identifierObjQualifier.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/attributeHeader.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/attributeHeaderFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/attributeInHeader.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/executionResponse.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/measureGroupHeader.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/measureHeaderItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/measureHeaderItemFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/resultDimension.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/response/totalHeaderItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/attributeHeaderItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/executionResult.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/executionResultFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/paging.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/resultMeasureHeaderItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/resultTotalHeaderItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/result/warning.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/attributeLocatorItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/attributeSortItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/attributeSortItemWithAggregation.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/dimension.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/dimensionFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/measureLocatorItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/measureSortItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/resultSpec.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/totalItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/resultspec/totalLocatorItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/uriObjQualifier.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/visualizationExecution.json (100%) rename {src => gooddata-java-model/src}/test/resources/executeafm/visualizationExecutionFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/export/client-export-simple.json (100%) rename {src => gooddata-java-model/src}/test/resources/export/client-export.json (100%) rename {src => gooddata-java-model/src}/test/resources/featureflag/featureFlags.json (100%) rename {src => gooddata-java-model/src}/test/resources/featureflag/projectFeatureFlags.json (100%) rename {src => gooddata-java-model/src}/test/resources/gdc/asyncTask.json (100%) rename {src => gooddata-java-model/src}/test/resources/gdc/gdc.json (100%) rename {src => gooddata-java-model/src}/test/resources/gdc/linkEntries.json (100%) rename {src => gooddata-java-model/src}/test/resources/gdc/task-status.json (100%) rename {src => gooddata-java-model/src}/test/resources/gdc/uriResponse.json (100%) rename {src => gooddata-java-model/src}/test/resources/lcm/lcmEntities.json (100%) rename {src => gooddata-java-model/src}/test/resources/lcm/lcmEntitiesEmpty.json (100%) rename {src => gooddata-java-model/src}/test/resources/lcm/lcmEntity.json (100%) rename {src => gooddata-java-model/src}/test/resources/lcm/lcmEntityFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attribute-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attribute-inputOrig.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attribute-sortDf.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attribute.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attributeDisplayForm-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attributeDisplayForm-inputOrig.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attributeDisplayForm.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attributeElement.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attributeElements.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/attributeSort.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/column.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/dataLoadingColumn.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/dataset-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/dataset.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/dimension-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/dimension.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/dimensionAttribute.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/displayForm-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/displayForm.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/entry.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/fact-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/fact.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/maintenance/partialMDArtifact.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/maintenance/partialMDExport-defaultVals.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/maintenance/partialMDExport.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/maintenance/partialMDImport.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/meta-withFlags.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/meta.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/metric-folder.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/metric-links.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/metric-new.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/metric-out.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/objCommon.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/projectDashboard.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/projectDashboardCreate.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/query.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/attributeInGrid.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/grid-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/grid.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/gridElements.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/gridReportDefinitionContent-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/gridReportDefinitionContent.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/metricElement.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/oneNumberReportDefinition-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/oneNumberReportDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/oneNumberReportDefinitionContent-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/oneNumberReportDefinitionContent.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/report-input.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/report/report.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/scheduledMail.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/table.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/tableDataLoad.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/attributeBucket.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/barVisualizationClass.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/complexVisualizationObject.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/customChart.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/emptyBucketsVisualization.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/externalVisualizationClass.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/lineChart.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/measureBucket.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/mixedBucket.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/multipleAttributeBucketsVisualization.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/multipleAttributesBucket.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/multipleMeasureBucketsVisualization.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/multipleMeasuresBucket.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/noItemsBucket.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/segmentedLineChart.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/simpleMeasure.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/simpleVisualizationObject.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/stackedColumnChart.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/tableVisualizationClass.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/visualizationAttribute.json (100%) rename {src => gooddata-java-model/src}/test/resources/md/visualization/visualizationAttributeFull.json (100%) rename {src => gooddata-java-model/src}/test/resources/model/maql-ddl-task-status-fail.json (100%) rename {src => gooddata-java-model/src}/test/resources/model/maqlDdlLinks.json (100%) rename {src => gooddata-java-model/src}/test/resources/model/modelDiff.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/channel.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/channelToCreate.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/condition.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/emailConfiguration.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/projectEvent.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/subscription.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/subscriptionToCreate.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/template.json (100%) rename {src => gooddata-java-model/src}/test/resources/notification/timerEvent.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/addUsersToProject.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/created-invitations-uris-only.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/created-invitations.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/invitations.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-role.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-role2.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-role3.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-roles.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-template.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-templates.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-user.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-users.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-validate.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-validationAvail.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-validationResultItem.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-validationResultLog.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-validationResultParam.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-validationResults.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project-vertica.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/project.json (100%) rename {src => gooddata-java-model/src}/test/resources/project/projectUsersUpdateResult.json (100%) rename {src => gooddata-java-model/src}/test/resources/projecttemplate/template.json (100%) rename {src => gooddata-java-model/src}/test/resources/report/executeDefinition.json (100%) rename {src => gooddata-java-model/src}/test/resources/report/executeReport.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/schema.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/schemas.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/user-createWithLogin.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/user-createWithProfile.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/user.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/users-empty.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/users.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouse-create.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouse-null-token.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouse-withLicense.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouse.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouseTask-finished.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouseTask-poll.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouses-empty.json (100%) rename {src => gooddata-java-model/src}/test/resources/warehouse/warehouses.json (100%) create mode 100644 gooddata-java/pom.xml rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/AbstractPollHandler.java (92%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/AbstractPollHandlerBase.java (93%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/AbstractService.java (97%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/Authentication.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/DeprecationWarningRequestInterceptor.java (98%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/FutureResult.java (89%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/GoodData.java (92%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/GoodDataEndpoint.java (96%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/GoodDataSettings.java (98%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/HeaderSettingRequestInterceptor.java (95%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/PollHandler.java (92%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/PollResult.java (93%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/SimplePollHandler.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/account/AccountNotFoundException.java (85%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/account/AccountService.java (95%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/auditevent/AuditEventPageRequest.java (97%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/auditevent/AuditEventService.java (90%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/auditevent/AuditEventsForbiddenException.java (51%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/authentication/LoginPasswordAuthentication.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/authentication/SstAuthentication.java (87%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/connector/ConnectorException.java (82%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/connector/ConnectorService.java (95%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/connector/IntegrationNotFoundException.java (81%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataload/OutputStageService.java (86%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataload/processes/ProcessExecutionException.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataload/processes/ProcessNotFoundException.java (82%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataload/processes/ProcessService.java (96%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataload/processes/ScheduleExecutionException.java (81%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataload/processes/ScheduleNotFoundException.java (82%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataset/DatasetException.java (91%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/dataset/DatasetService.java (90%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/executeafm/ExecuteAfmService.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/executeafm/ExecutionResultException.java (80%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/export/ExportException.java (73%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/export/ExportService.java (91%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/export/NoDataExportException.java (74%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/featureflag/FeatureFlagService.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/gdc/DataStoreException.java (79%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/gdc/DataStoreService.java (97%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/gdc/GdcSardine.java (91%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/gdc/GdcService.java (84%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/lcm/LcmEntityFilter.java (94%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/lcm/LcmService.java (93%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/MetadataService.java (94%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/NonUniqueObjException.java (85%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/ObjCreateException.java (89%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/ObjNotFoundException.java (92%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/ObjUpdateException.java (89%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/maintenance/ExportImportException.java (82%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/md/maintenance/ExportImportService.java (86%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/notification/NotificationService.java (89%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/project/ProjectNotFoundException.java (85%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/project/ProjectService.java (96%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/project/ProjectUsersUpdateException.java (83%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/project/RoleNotFoundException.java (83%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/project/UserInProjectNotFoundException.java (83%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service/project}/model/ModelException.java (80%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service/project}/model/ModelService.java (86%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/projecttemplate/ProjectTemplateService.java (88%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/report/NoDataReportException.java (69%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/report/ReportException.java (70%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/report/ReportService.java (76%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/util/ResponseErrorHandler.java (95%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/util/ZipHelper.java (97%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/warehouse/WarehouseNotFoundException.java (85%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/warehouse/WarehouseSchemaNotFoundException.java (86%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/warehouse/WarehouseService.java (97%) rename {src/main/java/com/gooddata => gooddata-java/src/main/java/com/gooddata/sdk/service}/warehouse/WarehouseUserNotFoundException.java (85%) rename {src => gooddata-java/src}/main/javadoc/overview.html (100%) rename {src/test/groovy/com/gooddata => gooddata-java/src/test/groovy/com/gooddata/sdk/service}/GoodDataIT.groovy (95%) rename {src/test/groovy/com/gooddata => gooddata-java/src/test/groovy/com/gooddata/sdk/service}/GoodDataITBase.groovy (85%) rename {src/test/groovy/com/gooddata => gooddata-java/src/test/groovy/com/gooddata/sdk/service}/executeafm/ExecuteAfmServiceIT.groovy (84%) rename {src/test/groovy/com/gooddata => gooddata-java/src/test/groovy/com/gooddata/sdk/service}/executeafm/ExecutionResultExceptionTest.groovy (80%) rename {src/test/groovy/com/gooddata => gooddata-java/src/test/groovy/com/gooddata/sdk/service}/lcm/LcmEntityFilterTest.groovy (86%) rename {src/test/groovy/com/gooddata => gooddata-java/src/test/groovy/com/gooddata/sdk/service}/lcm/LcmServiceIT.groovy (88%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/AbstractGoodDataAT.java (79%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/AbstractGoodDataIT.java (85%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/AbstractServiceTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/GoodDataEndpointTest.java (85%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/GoodDataSettingsTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/PollHandlerIT.java (92%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/account/AccountServiceAT.java (92%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/account/AccountServiceIT.java (97%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/auditevent/AuditEventPageRequestTest.java (96%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/auditevent/AuditEventServiceAT.java (50%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/auditevent/AuditEventServiceIT.java (84%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/auditevent/AuditEventServiceTest.java (85%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/authentication/LoginPasswordAuthenticationTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/authentication/SstAuthenticationTest.java (89%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/connector/ConnectorServiceIT.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/OutputStageServiceAT.java (89%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/OutputStageServiceIT.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/OutputStageServiceTest.java (72%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/processes/ProcessIdMatcher.java (82%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/processes/ProcessServiceAT.java (85%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/processes/ProcessServiceIT.java (98%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/processes/ProcessServiceTest.java (84%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataload/processes/ScheduleIdMatcher.java (82%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataset/DatasetServiceAT.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataset/DatasetServiceIT.java (97%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/dataset/DatasetServiceTest.java (71%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/executeafm/ExecuteAfmServiceAT.java (78%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/export/ExportServiceAT.java (87%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/export/ExportServiceIT.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/export/ExportServiceTest.java (86%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/featureflag/FeatureFlagServiceAT.java (89%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/featureflag/FeatureFlagServiceIT.java (91%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/featureflag/FeatureFlagServiceTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/gdc/DataStoreServiceIT.java (92%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/gdc/DatastoreServiceAT.java (77%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/gdc/GdcServiceIT.java (86%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/md/ExportImportServiceAT.java (79%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/md/MetadataServiceAT.java (91%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/md/MetadataServiceIT.java (92%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/md/MetadataServiceTest.java (81%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/md/maintenance/ExportImportServiceIT.java (95%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/md/maintenance/ExportImportServiceTest.java (80%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/notification/NotificationServiceAT.java (90%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/notification/NotificationServiceIT.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/notification/NotificationServiceTest.java (90%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/project/ProjectIdMatcher.java (84%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/project/ProjectServiceAT.java (90%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/project/ProjectServiceIT.java (97%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/project/ProjectServiceTest.java (93%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service/project}/model/ModelServiceAT.java (78%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service/project}/model/ModelServiceIT.java (81%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/projecttemplate/ProjectTemplateServiceIT.java (88%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/report/ReportServiceTest.java (79%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/spring/GoodDataBeansAsServicesIT.java (51%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/util/ResponseErrorHandlerTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/util/ZipHelperTest.java (97%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/warehouse/WarehouseIdMatcher.java (84%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/warehouse/WarehouseServiceAT.java (91%) rename {src/test/java/com/gooddata => gooddata-java/src/test/java/com/gooddata/sdk/service}/warehouse/WarehouseServiceIT.java (98%) create mode 100644 gooddata-java/src/test/resources/account/account-input.json create mode 100644 gooddata-java/src/test/resources/account/account.json rename {src => gooddata-java/src}/test/resources/account/create-account-response.json (100%) create mode 100644 gooddata-java/src/test/resources/account/create-account.json rename {src => gooddata-java/src}/test/resources/account/update-account.json (100%) create mode 100644 gooddata-java/src/test/resources/auditevents/auditEvent.json create mode 100644 gooddata-java/src/test/resources/auditevents/auditEventWithParam.json create mode 100644 gooddata-java/src/test/resources/auditevents/auditEventWithParamAndLink.json create mode 100644 gooddata-java/src/test/resources/auditevents/auditEvents.json rename {src => gooddata-java/src}/test/resources/auditevents/auditEventsPage2.json (100%) create mode 100644 gooddata-java/src/test/resources/auditevents/emptyAuditEvents.json create mode 100644 gooddata-java/src/test/resources/auditevents/userAuditEvents.json rename {src => gooddata-java/src}/test/resources/city.csv (100%) create mode 100644 gooddata-java/src/test/resources/connector/coupa_instance.json rename {src => gooddata-java/src}/test/resources/connector/coupa_instances-empty.json (100%) create mode 100644 gooddata-java/src/test/resources/connector/coupa_instances.json create mode 100644 gooddata-java/src/test/resources/connector/integration-in.json rename {src => gooddata-java/src}/test/resources/connector/integration-scheduled-process.json (100%) create mode 100644 gooddata-java/src/test/resources/connector/integration.json create mode 100644 gooddata-java/src/test/resources/connector/process-execution-coupa-downloadDate.json create mode 100644 gooddata-java/src/test/resources/connector/process-execution-empty.json create mode 100644 gooddata-java/src/test/resources/connector/process-execution-incremental.json create mode 100644 gooddata-java/src/test/resources/connector/process-execution-pardot-changesFrom.json create mode 100644 gooddata-java/src/test/resources/connector/process-execution-zendesk4-download.json create mode 100644 gooddata-java/src/test/resources/connector/process-execution-zendesk4-startDate.json create mode 100644 gooddata-java/src/test/resources/connector/process-status-embedded.json create mode 100644 gooddata-java/src/test/resources/connector/process-status-error.json rename {src => gooddata-java/src}/test/resources/connector/process-status-finished.json (100%) rename {src => gooddata-java/src}/test/resources/connector/process-status-scheduled.json (100%) create mode 100644 gooddata-java/src/test/resources/connector/settings-coupa.json create mode 100644 gooddata-java/src/test/resources/connector/settings-pardot.json create mode 100644 gooddata-java/src/test/resources/connector/settings-zendesk4-before-template26.json create mode 100644 gooddata-java/src/test/resources/connector/settings-zendesk4.json rename {src => gooddata-java/src}/test/resources/corruptedPerson.csv (100%) create mode 100644 gooddata-java/src/test/resources/dataload/outputStage.json create mode 100644 gooddata-java/src/test/resources/dataload/outputStageAllFields.json create mode 100644 gooddata-java/src/test/resources/dataload/outputStageNoProcess.json rename {src => gooddata-java/src}/test/resources/dataload/processes/appstoreProcess.json (100%) rename {src => gooddata-java/src}/test/resources/dataload/processes/asyncTask.json (100%) create mode 100644 gooddata-java/src/test/resources/dataload/processes/emptyScheduleExecution.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/execution.json rename {src => gooddata-java/src}/test/resources/dataload/processes/executionDetail-success.json (100%) create mode 100644 gooddata-java/src/test/resources/dataload/processes/executionDetail.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/executionTask.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/process-input-withPath.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/process-input.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/process.json rename {src => gooddata-java/src}/test/resources/dataload/processes/processWithoutData.json (100%) create mode 100644 gooddata-java/src/test/resources/dataload/processes/processes.json rename {src => gooddata-java/src}/test/resources/dataload/processes/schedule-disabled.json (100%) create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedule-input-all-fields.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedule-input.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedule-triggered-input.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedule-triggered.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedule.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/scheduleExecution.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedules.json create mode 100644 gooddata-java/src/test/resources/dataload/processes/schedules_page1.json rename {src => gooddata-java/src}/test/resources/dataload/processes/schedules_page2.json (100%) rename {src => gooddata-java/src}/test/resources/dataload/processes/testgraph/invalid.grf (100%) rename {src => gooddata-java/src}/test/resources/dataload/processes/testgraph/sdktest.grf (100%) rename {src => gooddata-java/src}/test/resources/dataload/processes/testgraph/workspace.prm (100%) create mode 100644 gooddata-java/src/test/resources/dataset/dataset.json create mode 100644 gooddata-java/src/test/resources/dataset/datasetLinks.json create mode 100644 gooddata-java/src/test/resources/dataset/datasetManifest-input.json create mode 100644 gooddata-java/src/test/resources/dataset/datasetManifest.json create mode 100644 gooddata-java/src/test/resources/dataset/maqlDml.json create mode 100644 gooddata-java/src/test/resources/dataset/pull.json create mode 100644 gooddata-java/src/test/resources/dataset/pullTask.json rename {src => gooddata-java/src}/test/resources/dataset/pullTaskStatusError.json (100%) rename {src => gooddata-java/src}/test/resources/dataset/pullTaskStatusOk.json (100%) rename {src => gooddata-java/src}/test/resources/dataset/pullTaskStatusRunning.json (100%) create mode 100644 gooddata-java/src/test/resources/dataset/taskStateOK.json create mode 100644 gooddata-java/src/test/resources/dataset/uploads/data-sets.json create mode 100644 gooddata-java/src/test/resources/dataset/uploads/data-uploads-info.json create mode 100644 gooddata-java/src/test/resources/dataset/uploads/upload.json create mode 100644 gooddata-java/src/test/resources/dataset/uploads/uploads.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/absoluteDateFilter.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/afm.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/arithmeticMeasureDefinition.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/attributeItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/attributeItemFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/expressionFilter.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/measureItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/measureItemFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/nativeTotalItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/negativeAttributeFilter.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/overPeriodDateAttribute.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/overPeriodMeasureDefinition.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/overPeriodMeasureDefinitionWithTwoAttributes.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/popMeasureDefinition.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/positiveAttributeFilter.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/previousPeriodDateDataSet.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/previousPeriodMeasureDefinition.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/previousPeriodMeasureDefinitionWithTwoDataSets.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/relativeDateFilter.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/simpleMeasureDefinition.json create mode 100644 gooddata-java/src/test/resources/executeafm/afm/simpleMeasureDefinitionFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/empty.json create mode 100644 gooddata-java/src/test/resources/executeafm/execution.json create mode 100644 gooddata-java/src/test/resources/executeafm/executionFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/identifierObjQualifier.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/attributeHeader.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/attributeHeaderFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/attributeInHeader.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/executionResponse.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/measureGroupHeader.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/measureHeaderItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/measureHeaderItemFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/resultDimension.json create mode 100644 gooddata-java/src/test/resources/executeafm/response/totalHeaderItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/attributeHeaderItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/executionResult.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/executionResultFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/paging.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/resultMeasureHeaderItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/resultTotalHeaderItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/result/warning.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/attributeLocatorItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/attributeSortItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/attributeSortItemWithAggregation.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/dimension.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/dimensionFull.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/measureLocatorItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/measureSortItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/resultSpec.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/totalItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/resultspec/totalLocatorItem.json create mode 100644 gooddata-java/src/test/resources/executeafm/uriObjQualifier.json create mode 100644 gooddata-java/src/test/resources/executeafm/visualizationExecution.json create mode 100644 gooddata-java/src/test/resources/executeafm/visualizationExecutionFull.json rename {src => gooddata-java/src}/test/resources/export/asynctask.json (100%) create mode 100644 gooddata-java/src/test/resources/export/client-export-simple.json create mode 100644 gooddata-java/src/test/resources/export/client-export.json create mode 100644 gooddata-java/src/test/resources/featureflag/featureFlags.json rename {src => gooddata-java/src}/test/resources/featureflag/projectFeatureFlag.json (100%) create mode 100644 gooddata-java/src/test/resources/featureflag/projectFeatureFlags.json create mode 100644 gooddata-java/src/test/resources/gdc/asyncTask.json rename {src => gooddata-java/src}/test/resources/gdc/errorStructure.json (100%) create mode 100644 gooddata-java/src/test/resources/gdc/gdc.json rename {src => gooddata-java/src}/test/resources/gdc/gdcError.json (100%) rename {src => gooddata-java/src}/test/resources/gdc/invalidError.json (100%) create mode 100644 gooddata-java/src/test/resources/gdc/linkEntries.json create mode 100644 gooddata-java/src/test/resources/gdc/task-status.json create mode 100644 gooddata-java/src/test/resources/gdc/uriResponse.json create mode 100644 gooddata-java/src/test/resources/lcm/lcmEntities.json create mode 100644 gooddata-java/src/test/resources/lcm/lcmEntitiesEmpty.json create mode 100644 gooddata-java/src/test/resources/lcm/lcmEntity.json create mode 100644 gooddata-java/src/test/resources/lcm/lcmEntityFull.json rename {src => gooddata-java/src}/test/resources/log4j.properties (100%) create mode 100644 gooddata-java/src/test/resources/md/attribute-input.json create mode 100644 gooddata-java/src/test/resources/md/attribute-inputOrig.json create mode 100644 gooddata-java/src/test/resources/md/attribute-sortDf.json create mode 100644 gooddata-java/src/test/resources/md/attribute.json create mode 100644 gooddata-java/src/test/resources/md/attributeDisplayForm-input.json create mode 100644 gooddata-java/src/test/resources/md/attributeDisplayForm-inputOrig.json create mode 100644 gooddata-java/src/test/resources/md/attributeDisplayForm.json create mode 100644 gooddata-java/src/test/resources/md/attributeElement.json create mode 100644 gooddata-java/src/test/resources/md/attributeElements-empty.json create mode 100644 gooddata-java/src/test/resources/md/attributeElements.json create mode 100644 gooddata-java/src/test/resources/md/attributeSort.json rename {src => gooddata-java/src}/test/resources/md/bulk-get.json (100%) create mode 100644 gooddata-java/src/test/resources/md/column.json create mode 100644 gooddata-java/src/test/resources/md/dataLoadingColumn.json create mode 100644 gooddata-java/src/test/resources/md/dataset-input.json create mode 100644 gooddata-java/src/test/resources/md/dataset.json create mode 100644 gooddata-java/src/test/resources/md/dimension-input.json create mode 100644 gooddata-java/src/test/resources/md/dimension.json create mode 100644 gooddata-java/src/test/resources/md/dimensionAttribute.json create mode 100644 gooddata-java/src/test/resources/md/displayForm-input.json create mode 100644 gooddata-java/src/test/resources/md/displayForm.json create mode 100644 gooddata-java/src/test/resources/md/entry.json create mode 100644 gooddata-java/src/test/resources/md/fact-input.json create mode 100644 gooddata-java/src/test/resources/md/fact.json rename {src => gooddata-java/src}/test/resources/md/identifierToUri.json (100%) rename {src => gooddata-java/src}/test/resources/md/identifiersAndUris.json (100%) rename {src => gooddata-java/src}/test/resources/md/maintenance/partial-export-task-status-fail.json (100%) rename {src => gooddata-java/src}/test/resources/md/maintenance/partial-import-task-status-fail.json (100%) create mode 100644 gooddata-java/src/test/resources/md/maintenance/partialMDArtifact.json create mode 100644 gooddata-java/src/test/resources/md/maintenance/partialMDExport-defaultVals.json create mode 100644 gooddata-java/src/test/resources/md/maintenance/partialMDExport.json create mode 100644 gooddata-java/src/test/resources/md/maintenance/partialMDImport.json create mode 100644 gooddata-java/src/test/resources/md/meta.json rename {src => gooddata-java/src}/test/resources/md/metric-created.json (100%) create mode 100644 gooddata-java/src/test/resources/md/metric-folder.json rename {src => gooddata-java/src}/test/resources/md/metric-input.json (100%) create mode 100644 gooddata-java/src/test/resources/md/metric-links.json create mode 100644 gooddata-java/src/test/resources/md/metric-new.json create mode 100644 gooddata-java/src/test/resources/md/metric-out.json rename {src => gooddata-java/src}/test/resources/md/metric.json (100%) create mode 100644 gooddata-java/src/test/resources/md/objCommon.json create mode 100644 gooddata-java/src/test/resources/md/projectDashboard.json create mode 100644 gooddata-java/src/test/resources/md/projectDashboardCreate.json create mode 100644 gooddata-java/src/test/resources/md/query.json create mode 100644 gooddata-java/src/test/resources/md/report/attributeInGrid.json create mode 100644 gooddata-java/src/test/resources/md/report/grid-input.json create mode 100644 gooddata-java/src/test/resources/md/report/grid.json create mode 100644 gooddata-java/src/test/resources/md/report/gridElements.json rename {src => gooddata-java/src}/test/resources/md/report/gridReportDefinition.json (100%) create mode 100644 gooddata-java/src/test/resources/md/report/gridReportDefinitionContent-input.json create mode 100644 gooddata-java/src/test/resources/md/report/gridReportDefinitionContent.json create mode 100644 gooddata-java/src/test/resources/md/report/metricElement.json create mode 100644 gooddata-java/src/test/resources/md/report/oneNumberReportDefinition-input.json create mode 100644 gooddata-java/src/test/resources/md/report/oneNumberReportDefinition.json create mode 100644 gooddata-java/src/test/resources/md/report/oneNumberReportDefinitionContent-input.json create mode 100644 gooddata-java/src/test/resources/md/report/oneNumberReportDefinitionContent.json create mode 100644 gooddata-java/src/test/resources/md/report/report-input.json create mode 100644 gooddata-java/src/test/resources/md/report/report.json create mode 100644 gooddata-java/src/test/resources/md/scheduledMail.json create mode 100644 gooddata-java/src/test/resources/md/table.json create mode 100644 gooddata-java/src/test/resources/md/tableDataLoad.json create mode 100644 gooddata-java/src/test/resources/md/visualization/attributeBucket.json create mode 100644 gooddata-java/src/test/resources/md/visualization/barVisualizationClass.json create mode 100644 gooddata-java/src/test/resources/md/visualization/complexVisualizationObject.json create mode 100644 gooddata-java/src/test/resources/md/visualization/customChart.json create mode 100644 gooddata-java/src/test/resources/md/visualization/emptyBucketsVisualization.json create mode 100644 gooddata-java/src/test/resources/md/visualization/externalVisualizationClass.json create mode 100644 gooddata-java/src/test/resources/md/visualization/lineChart.json create mode 100644 gooddata-java/src/test/resources/md/visualization/measureBucket.json create mode 100644 gooddata-java/src/test/resources/md/visualization/mixedBucket.json create mode 100644 gooddata-java/src/test/resources/md/visualization/multipleAttributeBucketsVisualization.json create mode 100644 gooddata-java/src/test/resources/md/visualization/multipleAttributesBucket.json create mode 100644 gooddata-java/src/test/resources/md/visualization/multipleMeasureBucketsVisualization.json create mode 100644 gooddata-java/src/test/resources/md/visualization/multipleMeasuresBucket.json create mode 100644 gooddata-java/src/test/resources/md/visualization/noItemsBucket.json create mode 100644 gooddata-java/src/test/resources/md/visualization/segmentedLineChart.json create mode 100644 gooddata-java/src/test/resources/md/visualization/simpleMeasure.json create mode 100644 gooddata-java/src/test/resources/md/visualization/simpleVisualizationObject.json create mode 100644 gooddata-java/src/test/resources/md/visualization/stackedColumnChart.json create mode 100644 gooddata-java/src/test/resources/md/visualization/tableVisualizationClass.json create mode 100644 gooddata-java/src/test/resources/md/visualization/visualizationAttribute.json create mode 100644 gooddata-java/src/test/resources/md/visualization/visualizationAttributeFull.json create mode 100644 gooddata-java/src/test/resources/model/maql-ddl-task-status-fail.json create mode 100644 gooddata-java/src/test/resources/model/maqlDdlLinks.json create mode 100644 gooddata-java/src/test/resources/model/modelDiff.json create mode 100644 gooddata-java/src/test/resources/notification/channel.json create mode 100644 gooddata-java/src/test/resources/notification/channelToCreate.json create mode 100644 gooddata-java/src/test/resources/notification/condition.json create mode 100644 gooddata-java/src/test/resources/notification/emailConfiguration.json rename {src => gooddata-java/src}/test/resources/notification/meta.json (100%) rename {src => gooddata-java/src}/test/resources/notification/metaToCreate.json (100%) create mode 100644 gooddata-java/src/test/resources/notification/projectEvent.json create mode 100644 gooddata-java/src/test/resources/notification/subscription.json create mode 100644 gooddata-java/src/test/resources/notification/subscriptionToCreate.json create mode 100644 gooddata-java/src/test/resources/notification/template.json create mode 100644 gooddata-java/src/test/resources/notification/timerEvent.json rename {src => gooddata-java/src}/test/resources/person.csv (100%) rename {src => gooddata-java/src}/test/resources/person.json (100%) rename {src => gooddata-java/src}/test/resources/project/addUserRequest.json (100%) create mode 100644 gooddata-java/src/test/resources/project/addUsersToProject.json create mode 100644 gooddata-java/src/test/resources/project/created-invitations-uris-only.json create mode 100644 gooddata-java/src/test/resources/project/created-invitations.json rename {src => gooddata-java/src}/test/resources/project/disableUserInProject.json (100%) create mode 100644 gooddata-java/src/test/resources/project/invitations.json rename {src => gooddata-java/src}/test/resources/project/project-deleted.json (100%) rename {src => gooddata-java/src}/test/resources/project/project-loading.json (100%) create mode 100644 gooddata-java/src/test/resources/project/project-role.json create mode 100644 gooddata-java/src/test/resources/project/project-role2.json create mode 100644 gooddata-java/src/test/resources/project/project-role3.json create mode 100644 gooddata-java/src/test/resources/project/project-roles.json create mode 100644 gooddata-java/src/test/resources/project/project-template.json create mode 100644 gooddata-java/src/test/resources/project/project-templates.json create mode 100644 gooddata-java/src/test/resources/project/project-user.json rename {src => gooddata-java/src}/test/resources/project/project-users-empty.json (100%) create mode 100644 gooddata-java/src/test/resources/project/project-users.json create mode 100644 gooddata-java/src/test/resources/project/project-validate.json create mode 100644 gooddata-java/src/test/resources/project/project-validationAvail.json create mode 100644 gooddata-java/src/test/resources/project/project-validationResultItem.json create mode 100644 gooddata-java/src/test/resources/project/project-validationResultLog.json create mode 100644 gooddata-java/src/test/resources/project/project-validationResultParam.json create mode 100644 gooddata-java/src/test/resources/project/project-validationResults.json create mode 100644 gooddata-java/src/test/resources/project/project-vertica.json create mode 100644 gooddata-java/src/test/resources/project/project.json create mode 100644 gooddata-java/src/test/resources/project/projectUsersUpdateResult.json rename {src => gooddata-java/src}/test/resources/project/projectUsersUpdateResultFail.json (100%) create mode 100644 gooddata-java/src/test/resources/projecttemplate/template.json rename {src => gooddata-java/src}/test/resources/projecttemplate/templates.json (100%) create mode 100644 gooddata-java/src/test/resources/report/executeDefinition.json create mode 100644 gooddata-java/src/test/resources/report/executeReport.json rename {src => gooddata-java/src}/test/resources/spring/gd-annotationConfig.xml (91%) rename {src => gooddata-java/src}/test/resources/warehouse/removeUserTask-finished.json (100%) create mode 100644 gooddata-java/src/test/resources/warehouse/schema.json create mode 100644 gooddata-java/src/test/resources/warehouse/schemas.json create mode 100644 gooddata-java/src/test/resources/warehouse/user-createWithLogin.json create mode 100644 gooddata-java/src/test/resources/warehouse/user-createWithProfile.json rename {src => gooddata-java/src}/test/resources/warehouse/user-withoutLogin.json (100%) create mode 100644 gooddata-java/src/test/resources/warehouse/user.json create mode 100644 gooddata-java/src/test/resources/warehouse/users-empty.json rename {src => gooddata-java/src}/test/resources/warehouse/users-with-next-page-link.json (100%) create mode 100644 gooddata-java/src/test/resources/warehouse/users.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouse-create.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouse-null-token.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouse-withLicense.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouse.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouseTask-finished.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouseTask-poll.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouses-empty.json create mode 100644 gooddata-java/src/test/resources/warehouse/warehouses.json diff --git a/findBugsFilter.xml b/findBugsFilter.xml index 6a8d28dac..8c3883671 100644 --- a/findBugsFilter.xml +++ b/findBugsFilter.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/gooddata-java-model/pom.xml b/gooddata-java-model/pom.xml new file mode 100644 index 000000000..f8337fc31 --- /dev/null +++ b/gooddata-java-model/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + gooddata-java-model + + + gooddata-java-parent + com.gooddata + 3.0.0-RC.1-SNAPSHOT + + + + + com.gooddata + gooddata-rest-common + + + org.springframework + spring-core + + + org.springframework + spring-web + + + aopalliance + aopalliance + + + org.springframework + spring-aop + + + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + org.apache.commons + commons-lang3 + + + joda-time + joda-time + + + + org.testng + testng + test + + + org.mockito + mockito-core + test + + + org.hamcrest + hamcrest + test + + + net.javacrumbs.json-unit + json-unit + test + + + net.javacrumbs.json-unit + json-unit-core + test + + + com.shazam + shazamcrest + test + + + nl.jqno.equalsverifier + equalsverifier + test + + + commons-io + commons-io + test + + + org.spockframework + spock-core + test + + + org.codehaus.groovy + groovy-all + test + + + cglib + cglib-nodep + test + + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + + + + + \ No newline at end of file diff --git a/src/main/java/com/gooddata/account/Account.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/account/Account.java similarity index 94% rename from src/main/java/com/gooddata/account/Account.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/account/Account.java index 0035a58e8..908873e6e 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/account/Account.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.account; +package com.gooddata.sdk.model.account; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -193,7 +193,12 @@ public String getProjects() { } } - static String getId(String uri) { + /** + * Extract Account's ID from Account's URI + * @param uri Account's URI + * @return Account's ID extracted from URI + */ + public static String getId(String uri) { return TEMPLATE.match(uri).get("id"); } @@ -205,6 +210,6 @@ public String toString() { /** * Class representing update view of account */ - static class UpdateView { + public static class UpdateView { } } diff --git a/src/main/java/com/gooddata/auditevent/AuditEvent.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEvent.java similarity index 97% rename from src/main/java/com/gooddata/auditevent/AuditEvent.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEvent.java index 670183a9c..71a680e4e 100644 --- a/src/main/java/com/gooddata/auditevent/AuditEvent.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEvent.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.auditevent; +package com.gooddata.sdk.model.auditevent; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/auditevent/AuditEvents.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEvents.java similarity index 91% rename from src/main/java/com/gooddata/auditevent/AuditEvents.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEvents.java index 892adb7b7..456d348e7 100644 --- a/src/main/java/com/gooddata/auditevent/AuditEvents.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEvents.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.auditevent; +package com.gooddata.sdk.model.auditevent; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/auditevent/AuditEventsDeserializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEventsDeserializer.java similarity index 86% rename from src/main/java/com/gooddata/auditevent/AuditEventsDeserializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEventsDeserializer.java index a3a94acf6..037b9b31e 100644 --- a/src/main/java/com/gooddata/auditevent/AuditEventsDeserializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEventsDeserializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.auditevent; +package com.gooddata.sdk.model.auditevent; import com.gooddata.collections.PageableListDeserializer; import com.gooddata.collections.Paging; diff --git a/src/main/java/com/gooddata/auditevent/AuditEventsSerializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEventsSerializer.java similarity index 76% rename from src/main/java/com/gooddata/auditevent/AuditEventsSerializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEventsSerializer.java index d866220b5..8441a24bd 100644 --- a/src/main/java/com/gooddata/auditevent/AuditEventsSerializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/auditevent/AuditEventsSerializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.auditevent; +package com.gooddata.sdk.model.auditevent; import com.gooddata.collections.PageableListSerializer; diff --git a/src/main/java/com/gooddata/connector/ConnectorType.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ConnectorType.java similarity index 86% rename from src/main/java/com/gooddata/connector/ConnectorType.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ConnectorType.java index c618f6fba..0748f1076 100644 --- a/src/main/java/com/gooddata/connector/ConnectorType.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ConnectorType.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; /** * Enum containing implemented connector types. diff --git a/src/main/java/com/gooddata/connector/CoupaInstance.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaInstance.java similarity index 94% rename from src/main/java/com/gooddata/connector/CoupaInstance.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaInstance.java index 175fe4764..ee7c9dbf0 100644 --- a/src/main/java/com/gooddata/connector/CoupaInstance.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaInstance.java @@ -1,17 +1,15 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import static com.gooddata.util.Validate.notEmpty; import com.fasterxml.jackson.annotation.*; import com.gooddata.util.GoodDataToStringBuilder; -import java.util.Objects; - /** * Coupa connector instance. */ diff --git a/src/main/java/com/gooddata/connector/CoupaInstances.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaInstances.java similarity index 69% rename from src/main/java/com/gooddata/connector/CoupaInstances.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaInstances.java index 5c49288c0..0c6558c0d 100644 --- a/src/main/java/com/gooddata/connector/CoupaInstances.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaInstances.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.*; @@ -16,9 +16,9 @@ @JsonTypeName("coupaInstances") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -class CoupaInstances { +public class CoupaInstances { - static final String URL = "/gdc/projects/{project}/connectors/coupa/integration/config/settings/instances"; + public static final String URL = "/gdc/projects/{project}/connectors/coupa/integration/config/settings/instances"; private final Collection items; @@ -27,7 +27,7 @@ private CoupaInstances(@JsonProperty("items") List items) { this.items = items; } - Collection getItems() { + public Collection getItems() { return items; } } diff --git a/src/main/java/com/gooddata/connector/CoupaProcessExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaProcessExecution.java similarity index 92% rename from src/main/java/com/gooddata/connector/CoupaProcessExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaProcessExecution.java index 5e0d7b2bf..9d60bb565 100644 --- a/src/main/java/com/gooddata/connector/CoupaProcessExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaProcessExecution.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.util.GDDateSerializer; diff --git a/src/main/java/com/gooddata/connector/CoupaSettings.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaSettings.java similarity index 89% rename from src/main/java/com/gooddata/connector/CoupaSettings.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaSettings.java index 10099513c..ec1dcf0e8 100644 --- a/src/main/java/com/gooddata/connector/CoupaSettings.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/CoupaSettings.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.*; import com.gooddata.util.GoodDataToStringBuilder; diff --git a/src/main/java/com/gooddata/connector/Integration.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Integration.java similarity index 96% rename from src/main/java/com/gooddata/connector/Integration.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Integration.java index 42199b169..98eec4ac3 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Integration.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/IntegrationProcessStatus.java similarity index 97% rename from src/main/java/com/gooddata/connector/IntegrationProcessStatus.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/IntegrationProcessStatus.java index 2230c88e8..b22a5e463 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/IntegrationProcessStatus.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import static com.gooddata.util.Validate.notNullState; diff --git a/src/main/java/com/gooddata/connector/PardotProcessExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/PardotProcessExecution.java similarity index 91% rename from src/main/java/com/gooddata/connector/PardotProcessExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/PardotProcessExecution.java index 8744b52de..886fd88e6 100644 --- a/src/main/java/com/gooddata/connector/PardotProcessExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/PardotProcessExecution.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.util.GDDateSerializer; diff --git a/src/main/java/com/gooddata/connector/PardotSettings.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/PardotSettings.java similarity index 90% rename from src/main/java/com/gooddata/connector/PardotSettings.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/PardotSettings.java index 5b6060b78..65bb32522 100644 --- a/src/main/java/com/gooddata/connector/PardotSettings.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/PardotSettings.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/connector/ProcessExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ProcessExecution.java similarity index 88% rename from src/main/java/com/gooddata/connector/ProcessExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ProcessExecution.java index c989cd6cd..3bc7c78f6 100644 --- a/src/main/java/com/gooddata/connector/ProcessExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ProcessExecution.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/connector/ProcessStatus.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ProcessStatus.java similarity index 93% rename from src/main/java/com/gooddata/connector/ProcessStatus.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ProcessStatus.java index b5063031e..d5d75d8dc 100644 --- a/src/main/java/com/gooddata/connector/ProcessStatus.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/ProcessStatus.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.gooddata.util.ISODateTimeDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/connector/Settings.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Settings.java similarity index 90% rename from src/main/java/com/gooddata/connector/Settings.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Settings.java index a44717a9f..ac5cb1734 100644 --- a/src/main/java/com/gooddata/connector/Settings.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Settings.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/connector/Status.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Status.java similarity index 88% rename from src/main/java/com/gooddata/connector/Status.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Status.java index 03b0fa7dd..0dba0aa70 100644 --- a/src/main/java/com/gooddata/connector/Status.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Status.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -11,9 +11,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; -import static com.gooddata.connector.Status.Code.ERROR; -import static com.gooddata.connector.Status.Code.SYNCHRONIZED; -import static com.gooddata.connector.Status.Code.USER_ERROR; +import static com.gooddata.sdk.model.connector.Status.Code.ERROR; +import static com.gooddata.sdk.model.connector.Status.Code.SYNCHRONIZED; +import static com.gooddata.sdk.model.connector.Status.Code.USER_ERROR; /** * Connector process status. Deserialization only. diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Zendesk4ProcessExecution.java similarity index 96% rename from src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Zendesk4ProcessExecution.java index f46fd57fa..d02bd3e1f 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Zendesk4ProcessExecution.java @@ -1,11 +1,11 @@ /* - * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; -import static com.gooddata.connector.ConnectorType.ZENDESK4; +import static com.gooddata.sdk.model.connector.ConnectorType.ZENDESK4; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/connector/Zendesk4Settings.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Zendesk4Settings.java similarity index 93% rename from src/main/java/com/gooddata/connector/Zendesk4Settings.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Zendesk4Settings.java index 16d80a904..7739d5c10 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Settings.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/connector/Zendesk4Settings.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.connector; +package com.gooddata.sdk.model.connector; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.connector.ConnectorType.ZENDESK4; +import static com.gooddata.sdk.model.connector.ConnectorType.ZENDESK4; /** * Zendesk 4 (Insights) connector settings. diff --git a/src/main/java/com/gooddata/dataload/OutputStage.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/OutputStage.java similarity index 92% rename from src/main/java/com/gooddata/dataload/OutputStage.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/OutputStage.java index 36fcac257..ee0b57075 100644 --- a/src/main/java/com/gooddata/dataload/OutputStage.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/OutputStage.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload; +package com.gooddata.sdk.model.dataload; import static com.gooddata.util.Validate.notNullState; @@ -14,6 +14,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.sdk.model.warehouse.WarehouseSchema; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; @@ -57,7 +58,7 @@ public Map getLinks() { } /** - * get datawarehouse schema uri {@link com.gooddata.warehouse.WarehouseSchema} + * get datawarehouse schema uri {@link WarehouseSchema} * * @return warehouse schema, can be null. */ @@ -72,7 +73,7 @@ public void setSchemaUri(final String schemaUri) { } /** - * check if there is associated schema {@link com.gooddata.warehouse.WarehouseSchema} with this output stage + * check if there is associated schema {@link WarehouseSchema} with this output stage * * @return true if there is associated schema, else false */ diff --git a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/AsyncTask.java similarity index 86% rename from src/main/java/com/gooddata/dataload/processes/AsyncTask.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/AsyncTask.java index 57579efed..53ea2477c 100644 --- a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/AsyncTask.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -15,14 +15,14 @@ /** * Asynchronous task containing link for polling. - * This task differs from {@link com.gooddata.gdc.AsyncTask} in links field. + * This task differs from {@link com.gooddata.sdk.model.gdc.AsyncTask} in links field. * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("asyncTask") @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class AsyncTask { +public class AsyncTask { @JsonProperty private final Links links; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/DataloadProcess.java similarity index 97% rename from src/main/java/com/gooddata/dataload/processes/DataloadProcess.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/DataloadProcess.java index 99c1a9fd5..20a9342ff 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/DataloadProcess.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/DataloadProcesses.java similarity index 85% rename from src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/DataloadProcesses.java index 1bd628943..8750ba917 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/DataloadProcesses.java @@ -1,11 +1,11 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; -import com.gooddata.account.Account; +import com.gooddata.sdk.model.account.Account; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -23,7 +23,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("processes") @JsonIgnoreProperties(ignoreUnknown = true) -class DataloadProcesses { +public class DataloadProcesses { public static final String URI = "/gdc/projects/{projectId}/dataload/processes"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); @@ -37,7 +37,7 @@ class DataloadProcesses { this.items = items; } - Collection getItems() { + public Collection getItems() { return items; } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecution.java similarity index 93% rename from src/main/java/com/gooddata/dataload/processes/ProcessExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecution.java index 54143a192..234210b4d 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecution.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -62,7 +62,7 @@ public Map getHiddenParams() { } @JsonIgnore - String getExecutionsUri() { + public String getExecutionsUri() { return executionsUri; } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecutionDetail.java similarity index 97% rename from src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecutionDetail.java index b21ae75eb..ec5c42a00 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecutionDetail.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecutionTask.java similarity index 85% rename from src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecutionTask.java index 57cc1e1f7..65e152c49 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessExecutionTask.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import static com.gooddata.util.Validate.notNullState; @@ -21,7 +21,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("executionTask") @JsonIgnoreProperties(ignoreUnknown = true) -class ProcessExecutionTask { +public class ProcessExecutionTask { private static final String POLL_LINK = "poll"; private static final String DETAIL_LINK = "detail"; @@ -38,7 +38,7 @@ String getPollLink() { return getPollUri(); } - String getPollUri() { + public String getPollUri() { return notNullState(links, "links").get(POLL_LINK); } @@ -47,7 +47,7 @@ String getDetailLink() { return getDetailUri(); } - String getDetailUri() { + public String getDetailUri() { return notNullState(links, "links").get(DETAIL_LINK); } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessType.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessType.java similarity index 75% rename from src/main/java/com/gooddata/dataload/processes/ProcessType.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessType.java index c78707544..1605741af 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessType.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ProcessType.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; /** * Represents type of dataload process. Please note that this enumeration must not be complete. diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/Schedule.java similarity index 98% rename from src/main/java/com/gooddata/dataload/processes/Schedule.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/Schedule.java index fda4b1f87..b555db3cd 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/Schedule.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.GoodDataToStringBuilder; diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ScheduleExecution.java similarity index 95% rename from src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ScheduleExecution.java index 2270d5ba9..6cb81e2de 100644 --- a/src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ScheduleExecution.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import static com.gooddata.util.Validate.notNullState; @@ -44,7 +44,7 @@ public class ScheduleExecution { private Map links; - ScheduleExecution() {} + public ScheduleExecution() {} @JsonCreator private ScheduleExecution(@JsonProperty("createdTime") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ScheduleState.java similarity index 67% rename from src/main/java/com/gooddata/dataload/processes/ScheduleState.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ScheduleState.java index 69b1aa687..973216d7e 100644 --- a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/ScheduleState.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; /** * Dataload schedule state. diff --git a/src/main/java/com/gooddata/dataload/processes/Schedules.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/Schedules.java similarity index 86% rename from src/main/java/com/gooddata/dataload/processes/Schedules.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/Schedules.java index 2afdfa217..d5fa4f21e 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedules.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/Schedules.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import com.gooddata.collections.PageableList; import com.gooddata.collections.Paging; @@ -22,7 +22,7 @@ @JsonTypeName("schedules") @JsonIgnoreProperties(ignoreUnknown = true) @JsonDeserialize(using = SchedulesDeserializer.class) -class Schedules extends PageableList { +public class Schedules extends PageableList { public static final String URI = "/gdc/projects/{projectId}/schedules"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); diff --git a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/SchedulesDeserializer.java similarity index 84% rename from src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/SchedulesDeserializer.java index 352445e47..440ac143c 100644 --- a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataload/processes/SchedulesDeserializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataload.processes; +package com.gooddata.sdk.model.dataload.processes; import com.gooddata.collections.PageableListDeserializer; import com.gooddata.collections.Paging; diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Dataset.java similarity index 72% rename from src/main/java/com/gooddata/dataset/Dataset.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Dataset.java index dbe983ec2..4d1704a53 100644 --- a/src/main/java/com/gooddata/dataset/Dataset.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Dataset.java @@ -1,23 +1,23 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.gdc.AboutLinks.Link; +import com.gooddata.sdk.model.gdc.AboutLinks; /** * Dataset link * - * @deprecated use {@link Link} instead + * @deprecated use {@link AboutLinks.Link} instead */ @Deprecated @JsonIgnoreProperties(ignoreUnknown = true) -public class Dataset extends Link { +public class Dataset extends AboutLinks.Link { @JsonCreator public Dataset(@JsonProperty("identifier") String identifier, @JsonProperty("link") String uri, diff --git a/src/main/java/com/gooddata/dataset/DatasetLinks.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetLinks.java similarity index 75% rename from src/main/java/com/gooddata/dataset/DatasetLinks.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetLinks.java index 40c6f1fb4..cf74439ed 100644 --- a/src/main/java/com/gooddata/dataset/DatasetLinks.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetLinks.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.*; -import com.gooddata.gdc.AboutLinks; +import com.gooddata.sdk.model.gdc.AboutLinks; import java.util.List; @@ -14,7 +14,7 @@ * Dataset links. * Deserialization only. */ -class DatasetLinks extends AboutLinks { +public class DatasetLinks extends AboutLinks { public static final String URI = "/gdc/md/{project}/ldm/singleloadinterface"; diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetManifest.java similarity index 98% rename from src/main/java/com/gooddata/dataset/DatasetManifest.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetManifest.java index 47c0f99c9..954ccde8c 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetManifest.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanDeserializer; diff --git a/src/main/java/com/gooddata/dataset/DatasetManifests.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetManifests.java similarity index 88% rename from src/main/java/com/gooddata/dataset/DatasetManifests.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetManifests.java index c6e8b0106..c6a2dbd77 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifests.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetManifests.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -16,7 +16,7 @@ /** * Encapsulates list of {@link DatasetManifest}. */ -class DatasetManifests { +public class DatasetManifests { private final Collection manifests; diff --git a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetNotFoundException.java similarity index 86% rename from src/main/java/com/gooddata/dataset/DatasetNotFoundException.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetNotFoundException.java index 4c5009774..4f3ed875f 100644 --- a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/DatasetNotFoundException.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import static java.lang.String.format; diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Datasets.java similarity index 76% rename from src/main/java/com/gooddata/dataset/Datasets.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Datasets.java index d1744aedb..ea5bd4c26 100644 --- a/src/main/java/com/gooddata/dataset/Datasets.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Datasets.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.*; -import com.gooddata.gdc.AboutLinks; +import com.gooddata.sdk.model.gdc.AboutLinks; import java.util.List; @@ -15,7 +15,7 @@ * @deprecated use {@link DatasetLinks} instead. */ @Deprecated -class Datasets extends AboutLinks { +public class Datasets extends AboutLinks { public static final String URI = "/gdc/md/{project}/ldm/singleloadinterface"; diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/EtlMode.java similarity index 91% rename from src/main/java/com/gooddata/dataset/EtlMode.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/EtlMode.java index decf8fb3f..ca3b439e0 100644 --- a/src/main/java/com/gooddata/dataset/EtlMode.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/EtlMode.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -17,7 +17,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class EtlMode { +public class EtlMode { public static final String URL = "/gdc/md/{project}/etl/mode"; diff --git a/src/main/java/com/gooddata/dataset/EtlModeType.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/EtlModeType.java similarity index 72% rename from src/main/java/com/gooddata/dataset/EtlModeType.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/EtlModeType.java index ca19ba799..6adbbe42e 100644 --- a/src/main/java/com/gooddata/dataset/EtlModeType.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/EtlModeType.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonValue; /** * Enum containing ETL mode types. */ -enum EtlModeType { +public enum EtlModeType { SLI, DLI, VOID; diff --git a/src/main/java/com/gooddata/dataset/LookupMode.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/LookupMode.java similarity index 73% rename from src/main/java/com/gooddata/dataset/LookupMode.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/LookupMode.java index 674b33773..ca77b4532 100644 --- a/src/main/java/com/gooddata/dataset/LookupMode.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/LookupMode.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonValue; /** * Enum containing ETL lookup modes. */ -enum LookupMode { +public enum LookupMode { RECREATE; diff --git a/src/main/java/com/gooddata/dataset/MaqlDml.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/MaqlDml.java similarity index 64% rename from src/main/java/com/gooddata/dataset/MaqlDml.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/MaqlDml.java index fbf64d047..8693ca76c 100644 --- a/src/main/java/com/gooddata/dataset/MaqlDml.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/MaqlDml.java @@ -1,17 +1,17 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; -import com.gooddata.gdc.AbstractMaql; +import com.gooddata.sdk.model.gdc.AbstractMaql; /** * MAQL DML statement. * Serialization only. */ -class MaqlDml extends AbstractMaql { +public class MaqlDml extends AbstractMaql { public static final String URI = "/gdc/md/{project}/dml/manage"; diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Pull.java similarity index 88% rename from src/main/java/com/gooddata/dataset/Pull.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Pull.java index 6b580573d..9b952610b 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Pull.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; @@ -15,7 +15,7 @@ * Serialization only. */ @JsonInclude(JsonInclude.Include.NON_NULL) -class Pull { +public class Pull { public static final String URI = "/gdc/md/{projectId}/etl/pull2"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/PullTask.java similarity index 92% rename from src/main/java/com/gooddata/dataset/PullTask.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/PullTask.java index 7da660d8f..6cac44b29 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/PullTask.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -22,7 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("pull2Task") @JsonIgnoreProperties(ignoreUnknown = true) -class PullTask { +public class PullTask { public static final String URI = "/gdc/md/{projectId}/tasks/task/{taskId}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/TaskState.java similarity index 92% rename from src/main/java/com/gooddata/dataset/TaskState.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/TaskState.java index 9a7ab835f..0b2a34930 100644 --- a/src/main/java/com/gooddata/dataset/TaskState.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/TaskState.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -21,7 +21,7 @@ @JsonTypeName("taskState") @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class TaskState { +public class TaskState { private static final String OK = "OK"; private static final String ERROR = "ERROR"; diff --git a/src/main/java/com/gooddata/dataset/Upload.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Upload.java similarity index 97% rename from src/main/java/com/gooddata/dataset/Upload.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Upload.java index ac3d3c999..69c60f981 100644 --- a/src/main/java/com/gooddata/dataset/Upload.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Upload.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/dataset/UploadMode.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadMode.java similarity index 93% rename from src/main/java/com/gooddata/dataset/UploadMode.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadMode.java index 38bf84500..fd573ac2b 100644 --- a/src/main/java/com/gooddata/dataset/UploadMode.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadMode.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/gooddata/dataset/UploadStatistics.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadStatistics.java similarity index 94% rename from src/main/java/com/gooddata/dataset/UploadStatistics.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadStatistics.java index 4b8ac9489..a27caeafa 100644 --- a/src/main/java/com/gooddata/dataset/UploadStatistics.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadStatistics.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/dataset/Uploads.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Uploads.java similarity index 86% rename from src/main/java/com/gooddata/dataset/Uploads.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Uploads.java index b11c569e6..ecc4d49b1 100644 --- a/src/main/java/com/gooddata/dataset/Uploads.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/Uploads.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -20,7 +20,7 @@ @JsonTypeName("dataUploads") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -class Uploads { +public class Uploads { private final Collection uploads; @@ -31,7 +31,7 @@ class Uploads { /** * @return all items of uploads collection */ - Collection items() { + public Collection items() { return uploads; } diff --git a/src/main/java/com/gooddata/dataset/UploadsInfo.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadsInfo.java similarity index 88% rename from src/main/java/com/gooddata/dataset/UploadsInfo.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadsInfo.java index f4109dac0..ff7d8482d 100644 --- a/src/main/java/com/gooddata/dataset/UploadsInfo.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/dataset/UploadsInfo.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.dataset; +package com.gooddata.sdk.model.dataset; import static com.gooddata.util.Validate.notEmpty; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; @@ -27,10 +27,10 @@ @JsonTypeName("dataSetsInfo") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -class UploadsInfo { +public class UploadsInfo { - static final String URI = "/gdc/md/{projectId}/data/sets"; - static final UriTemplate URI_TEMPLATE = new UriTemplate(URI); + public static final String URI = "/gdc/md/{projectId}/data/sets"; + public static final UriTemplate URI_TEMPLATE = new UriTemplate(URI); private final Map datasets = new HashMap<>(); @@ -49,7 +49,7 @@ class UploadsInfo { * @param datasetId dataset identifier * @return {@link DataSet} object */ - DataSet getDataSet(String datasetId) { + public DataSet getDataSet(String datasetId) { notEmpty(datasetId, "datasetId"); final DataSet dataSet = datasets.get(datasetId); @@ -76,7 +76,7 @@ public String toString() { * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) - static class DataSet { + public static class DataSet { private final Meta meta; private final String datasetUploadsUri; @@ -94,21 +94,21 @@ private DataSet( /** * @return dataset identifier */ - String getDatasetId() { + public String getDatasetId() { return meta.getIdentifier(); } /** * @return URI for all uploads of this dataset */ - String getUploadsUri() { + public String getUploadsUri() { return datasetUploadsUri; } /** * @return {@link Upload} uri of the last upload */ - String getLastUploadUri() { + public String getLastUploadUri() { return lastUpload.uri; } diff --git a/src/main/java/com/gooddata/executeafm/Execution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/Execution.java similarity index 86% rename from src/main/java/com/gooddata/executeafm/Execution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/Execution.java index e9cf09748..a44885282 100644 --- a/src/main/java/com/gooddata/executeafm/Execution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/Execution.java @@ -1,17 +1,17 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm; +package com.gooddata.sdk.model.executeafm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.executeafm.afm.Afm; -import com.gooddata.executeafm.resultspec.ResultSpec; +import com.gooddata.sdk.model.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec; import com.gooddata.util.GoodDataToStringBuilder; /** diff --git a/src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/IdentifierObjQualifier.java similarity index 76% rename from src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/IdentifierObjQualifier.java index 16958731a..adf7797b3 100644 --- a/src/main/java/com/gooddata/executeafm/IdentifierObjQualifier.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/IdentifierObjQualifier.java @@ -1,17 +1,20 @@ /* - * Copyright (C) 2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm; +package com.gooddata.sdk.model.executeafm; import com.fasterxml.jackson.annotation.JsonRootName; import com.fasterxml.jackson.annotation.JsonValue; +import com.gooddata.sdk.model.md.Obj; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; import java.util.Objects; /** - * Qualifies metadata {@link com.gooddata.md.Obj} using an identifier + * Qualifies metadata {@link Obj} using an identifier */ @JsonRootName("identifier") public final class IdentifierObjQualifier implements ObjQualifier, Serializable { diff --git a/src/main/java/com/gooddata/executeafm/ObjQualifier.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/ObjQualifier.java similarity index 68% rename from src/main/java/com/gooddata/executeafm/ObjQualifier.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/ObjQualifier.java index 61bdd4625..f5ce6b446 100644 --- a/src/main/java/com/gooddata/executeafm/ObjQualifier.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/ObjQualifier.java @@ -1,13 +1,16 @@ /* - * Copyright (C) 2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm; +package com.gooddata.sdk.model.executeafm; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.gooddata.sdk.model.md.Obj; /** - * Qualifies metadata {@link com.gooddata.md.Obj} + * Qualifies metadata {@link Obj} */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonSubTypes({ diff --git a/src/main/java/com/gooddata/executeafm/ResultPage.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/ResultPage.java similarity index 79% rename from src/main/java/com/gooddata/executeafm/ResultPage.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/ResultPage.java index e0812f84b..6ae469a61 100644 --- a/src/main/java/com/gooddata/executeafm/ResultPage.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/ResultPage.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm; +package com.gooddata.sdk.model.executeafm; -import com.gooddata.executeafm.response.ExecutionResponse; -import com.gooddata.executeafm.result.ExecutionResult; +import com.gooddata.sdk.model.executeafm.response.ExecutionResponse; +import com.gooddata.sdk.model.executeafm.result.ExecutionResult; import org.springframework.web.util.UriUtils; import java.io.UnsupportedEncodingException; @@ -17,7 +17,7 @@ /** * Represents page of {@link ExecutionResult} to be requested, using - * {@link com.gooddata.executeafm.ExecuteAfmService#getResult(ExecutionResponse, ResultPage)} + * {@link com.gooddata.sdk.executeafm.ExecuteAfmService#getResult(ExecutionResponse, ResultPage)} */ public class ResultPage { @@ -40,14 +40,14 @@ public ResultPage(final List offsets, final List limits) { /** * @return page offsets joined and URL-encoded to be used as query parameter */ - String getOffsetsQueryParam() { + public String getOffsetsQueryParam() { return toQueryParam(offsets); } /** * @return page limits joined and URL-encoded to be used as query parameter */ - String getLimitsQueryParam() { + public String getLimitsQueryParam() { return toQueryParam(limits); } diff --git a/src/main/java/com/gooddata/executeafm/UriObjQualifier.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/UriObjQualifier.java similarity index 75% rename from src/main/java/com/gooddata/executeafm/UriObjQualifier.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/UriObjQualifier.java index f8810edca..580afdbc4 100644 --- a/src/main/java/com/gooddata/executeafm/UriObjQualifier.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/UriObjQualifier.java @@ -1,17 +1,20 @@ /* - * Copyright (C) 2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm; +package com.gooddata.sdk.model.executeafm; import com.fasterxml.jackson.annotation.JsonRootName; import com.fasterxml.jackson.annotation.JsonValue; +import com.gooddata.sdk.model.md.Obj; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; import java.util.Objects; /** - * Qualifies metadata {@link com.gooddata.md.Obj} using an URI + * Qualifies metadata {@link Obj} using an URI */ @JsonRootName("uri") public final class UriObjQualifier implements ObjQualifier, Serializable { diff --git a/src/main/java/com/gooddata/executeafm/VisualizationExecution.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/VisualizationExecution.java similarity index 91% rename from src/main/java/com/gooddata/executeafm/VisualizationExecution.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/VisualizationExecution.java index 5be7ddf1e..6b1fa5393 100644 --- a/src/main/java/com/gooddata/executeafm/VisualizationExecution.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/VisualizationExecution.java @@ -1,21 +1,19 @@ /* - * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm; +package com.gooddata.sdk.model.executeafm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.executeafm.afm.CompatibilityFilter; -import com.gooddata.executeafm.resultspec.ResultSpec; +import com.gooddata.sdk.model.executeafm.afm.CompatibilityFilter; +import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** diff --git a/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AbsoluteDateFilter.java similarity index 92% rename from src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AbsoluteDateFilter.java index e4e7f3493..8be17f23f 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AbsoluteDateFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AbsoluteDateFilter.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -11,8 +11,8 @@ import com.fasterxml.jackson.annotation.JsonRootName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GDDateDeserializer; import com.gooddata.util.GDDateSerializer; import com.gooddata.util.GoodDataToStringBuilder; @@ -28,7 +28,7 @@ public class AbsoluteDateFilter extends DateFilter { private static final long serialVersionUID = -1857726227400504182L; static final String NAME = "absoluteDateFilter"; - + private final LocalDate from; private final LocalDate to; diff --git a/src/main/java/com/gooddata/executeafm/afm/Afm.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/Afm.java similarity index 97% rename from src/main/java/com/gooddata/executeafm/afm/Afm.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/Afm.java index 308d55aef..ba2774a54 100644 --- a/src/main/java/com/gooddata/executeafm/afm/Afm.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/Afm.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/executeafm/afm/Aggregation.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/Aggregation.java similarity index 80% rename from src/main/java/com/gooddata/executeafm/afm/Aggregation.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/Aggregation.java index 6b58d5973..10d32e84e 100644 --- a/src/main/java/com/gooddata/executeafm/afm/Aggregation.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/Aggregation.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ArithmeticMeasureDefinition.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ArithmeticMeasureDefinition.java index d16ca573f..95b981a52 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ArithmeticMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ArithmeticMeasureDefinition.java @@ -1,27 +1,25 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.Collections; import java.util.List; -import static com.gooddata.executeafm.afm.PreviousPeriodMeasureDefinition.NAME; - /** * Arithmetic measure definition representing aggregation of existing measures, for example sum of measures, difference,... */ -@JsonRootName(NAME) +@JsonRootName(PreviousPeriodMeasureDefinition.NAME) public class ArithmeticMeasureDefinition implements MeasureDefinition { private static final long serialVersionUID = -2597112924341600780L; diff --git a/src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AttributeFilter.java similarity index 89% rename from src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AttributeFilter.java index 2f8185ebe..63daff619 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AttributeFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AttributeFilter.java @@ -1,11 +1,11 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/com/gooddata/executeafm/afm/AttributeItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AttributeItem.java similarity index 84% rename from src/main/java/com/gooddata/executeafm/afm/AttributeItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AttributeItem.java index ba1e13ced..515de5c71 100644 --- a/src/main/java/com/gooddata/executeafm/afm/AttributeItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/AttributeItem.java @@ -1,14 +1,15 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.md.AttributeDisplayForm; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; @@ -28,7 +29,7 @@ public class AttributeItem implements LocallyIdentifiable, Serializable { /** * Creates new instance - * @param displayForm qualifier of {@link com.gooddata.md.AttributeDisplayForm} representing the attribute + * @param displayForm qualifier of {@link AttributeDisplayForm} representing the attribute * @param localIdentifier local identifier, unique within {@link Afm} * @param alias attribute alias */ @@ -43,7 +44,7 @@ public AttributeItem(@JsonProperty("displayForm") final ObjQualifier displayForm /** * Creates new instance - * @param displayForm qualifier of {@link com.gooddata.md.AttributeDisplayForm} representing the attribute + * @param displayForm qualifier of {@link AttributeDisplayForm} representing the attribute * @param localIdentifier local identifier, unique within {@link Afm} */ public AttributeItem(final ObjQualifier displayForm, final String localIdentifier) { @@ -57,7 +58,7 @@ public String getLocalIdentifier() { } /** - * @return qualifier of {@link com.gooddata.md.AttributeDisplayForm} representing the attribute + * @return qualifier of {@link AttributeDisplayForm} representing the attribute */ public ObjQualifier getDisplayForm() { return displayForm; diff --git a/src/main/java/com/gooddata/executeafm/afm/CompatibilityFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/CompatibilityFilter.java similarity index 84% rename from src/main/java/com/gooddata/executeafm/afm/CompatibilityFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/CompatibilityFilter.java index 2ecdc745f..294662290 100644 --- a/src/main/java/com/gooddata/executeafm/afm/CompatibilityFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/CompatibilityFilter.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/DateFilter.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/afm/DateFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/DateFilter.java index 3d33dd23c..cb19e30a2 100644 --- a/src/main/java/com/gooddata/executeafm/afm/DateFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/DateFilter.java @@ -1,13 +1,13 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/DerivedMeasureDefinition.java similarity index 95% rename from src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/DerivedMeasureDefinition.java index 5ca66998a..ca9c93158 100644 --- a/src/main/java/com/gooddata/executeafm/afm/DerivedMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/DerivedMeasureDefinition.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; diff --git a/src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ExpressionFilter.java similarity index 92% rename from src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ExpressionFilter.java index 615fa3b04..b81a38ac1 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ExpressionFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ExpressionFilter.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/afm/FilterItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/FilterItem.java similarity index 77% rename from src/main/java/com/gooddata/executeafm/afm/FilterItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/FilterItem.java index fd84243ca..1121a9554 100644 --- a/src/main/java/com/gooddata/executeafm/afm/FilterItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/FilterItem.java @@ -1,14 +1,15 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.md.Obj; /** * Covers all the filters which can be used within AFM @@ -23,7 +24,7 @@ public interface FilterItem extends CompatibilityFilter { /** - * Get qualifier of {@link com.gooddata.md.Obj} to which the filter relates. + * Get qualifier of {@link Obj} to which the filter relates. * @return filtered object qualifier */ @JsonIgnore diff --git a/src/main/java/com/gooddata/executeafm/afm/LocallyIdentifiable.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/LocallyIdentifiable.java similarity index 78% rename from src/main/java/com/gooddata/executeafm/afm/LocallyIdentifiable.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/LocallyIdentifiable.java index 35fc366e5..9a754ea1b 100644 --- a/src/main/java/com/gooddata/executeafm/afm/LocallyIdentifiable.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/LocallyIdentifiable.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; /** * Marker interface for all locally identifiable objects having local identifier in AFM diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/MeasureDefinition.java similarity index 88% rename from src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/MeasureDefinition.java index fe6fec1c3..187b7d7a3 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/MeasureDefinition.java @@ -1,18 +1,19 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.gooddata.executeafm.IdentifierObjQualifier; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; -import com.gooddata.md.visualization.VOPopMeasureDefinition; -import com.gooddata.md.visualization.VOSimpleMeasureDefinition; +import com.gooddata.sdk.model.executeafm.IdentifierObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.md.visualization.VOPopMeasureDefinition; +import com.gooddata.sdk.model.md.visualization.VOSimpleMeasureDefinition; +import com.gooddata.sdk.model.md.Metric; import java.io.Serializable; import java.util.Collection; @@ -30,7 +31,7 @@ public interface MeasureDefinition extends Serializable { /** - * Returns the definition in the form of uri of {@link com.gooddata.md.Metric}. + * Returns the definition in the form of uri of {@link Metric}. * Default implementation throws {@link UnsupportedOperationException} * * @return uri of the measure @@ -41,7 +42,7 @@ default String getUri() { } /** - * Returns the qualifier, qualifying the {@link com.gooddata.md.Metric}. + * Returns the qualifier, qualifying the {@link Metric}. * * @return qualifier of measure * diff --git a/src/main/java/com/gooddata/executeafm/afm/MeasureItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/MeasureItem.java similarity index 96% rename from src/main/java/com/gooddata/executeafm/afm/MeasureItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/MeasureItem.java index f536dfa8f..8abbced43 100644 --- a/src/main/java/com/gooddata/executeafm/afm/MeasureItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/MeasureItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/executeafm/afm/NativeTotalItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/NativeTotalItem.java similarity index 95% rename from src/main/java/com/gooddata/executeafm/afm/NativeTotalItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/NativeTotalItem.java index fd1883133..49d86e5b2 100644 --- a/src/main/java/com/gooddata/executeafm/afm/NativeTotalItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/NativeTotalItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/NegativeAttributeFilter.java similarity index 91% rename from src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/NegativeAttributeFilter.java index bcf5e0c80..65ac6cf88 100644 --- a/src/main/java/com/gooddata/executeafm/afm/NegativeAttributeFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/NegativeAttributeFilter.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -26,7 +26,7 @@ public class NegativeAttributeFilter extends AttributeFilter { private static final long serialVersionUID = -6202625318104289333L; static final String NAME = "negativeAttributeFilter"; - + private final List notIn; /** diff --git a/src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ObjIdentifierUtilities.java similarity index 89% rename from src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ObjIdentifierUtilities.java index 7cb682998..a593b61dd 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ObjIdentifierUtilities.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ObjIdentifierUtilities.java @@ -1,11 +1,13 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; -import com.gooddata.executeafm.IdentifierObjQualifier; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.IdentifierObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import java.util.function.Function; diff --git a/src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ObjQualifierConverter.java similarity index 63% rename from src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ObjQualifierConverter.java index 9227d78ab..884f27545 100644 --- a/src/main/java/com/gooddata/executeafm/afm/ObjQualifierConverter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/ObjQualifierConverter.java @@ -1,10 +1,12 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; -import com.gooddata.executeafm.IdentifierObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.IdentifierObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import java.util.Optional; diff --git a/src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/OverPeriodDateAttribute.java similarity index 94% rename from src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/OverPeriodDateAttribute.java index 6d2465754..4fd1e3ec5 100644 --- a/src/main/java/com/gooddata/executeafm/afm/OverPeriodDateAttribute.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/OverPeriodDateAttribute.java @@ -1,13 +1,13 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/OverPeriodMeasureDefinition.java similarity index 94% rename from src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/OverPeriodMeasureDefinition.java index b93b4ea27..a3eee0a6a 100644 --- a/src/main/java/com/gooddata/executeafm/afm/OverPeriodMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/OverPeriodMeasureDefinition.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -17,7 +17,7 @@ import java.util.Objects; import java.util.stream.Collectors; -import static com.gooddata.executeafm.afm.OverPeriodMeasureDefinition.NAME; +import static com.gooddata.sdk.model.executeafm.afm.OverPeriodMeasureDefinition.NAME; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PopMeasureDefinition.java similarity index 91% rename from src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PopMeasureDefinition.java index a93708a02..e722b632b 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PopMeasureDefinition.java @@ -1,16 +1,17 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.md.Metric; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -18,7 +19,7 @@ import java.util.Objects; import java.util.Optional; -import static com.gooddata.executeafm.afm.PopMeasureDefinition.NAME; +import static com.gooddata.sdk.model.executeafm.afm.PopMeasureDefinition.NAME; /** * Definition of so called "period over period" measure. @@ -78,7 +79,7 @@ public ObjQualifier getPopAttribute() { } /** - * Returns the qualifier used by the {@link com.gooddata.md.Metric}. + * Returns the qualifier used by the {@link Metric}. * * @return qualifier used by the metric, which is its {@link #popAttribute}. The null is returned in case when {@link #popAttribute} was not set. * diff --git a/src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PositiveAttributeFilter.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PositiveAttributeFilter.java index e1023208d..b97e9d115 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PositiveAttributeFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PositiveAttributeFilter.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; diff --git a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PreviousPeriodDateDataSet.java similarity index 94% rename from src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PreviousPeriodDateDataSet.java index 34c5808f1..04bec1032 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodDateDataSet.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PreviousPeriodDateDataSet.java @@ -1,13 +1,13 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PreviousPeriodMeasureDefinition.java similarity index 94% rename from src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PreviousPeriodMeasureDefinition.java index ff214e405..f88fb5bc4 100644 --- a/src/main/java/com/gooddata/executeafm/afm/PreviousPeriodMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/PreviousPeriodMeasureDefinition.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -17,7 +17,7 @@ import java.util.Objects; import java.util.stream.Collectors; -import static com.gooddata.executeafm.afm.PreviousPeriodMeasureDefinition.NAME; +import static com.gooddata.sdk.model.executeafm.afm.PreviousPeriodMeasureDefinition.NAME; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/RelativeDateFilter.java similarity index 92% rename from src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/RelativeDateFilter.java index ec7496558..3af842401 100644 --- a/src/main/java/com/gooddata/executeafm/afm/RelativeDateFilter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/RelativeDateFilter.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Objects; diff --git a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/SimpleMeasureDefinition.java similarity index 95% rename from src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/SimpleMeasureDefinition.java index edccaabd5..16d1032d3 100644 --- a/src/main/java/com/gooddata/executeafm/afm/SimpleMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/afm/SimpleMeasureDefinition.java @@ -1,16 +1,17 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.afm; +package com.gooddata.sdk.model.executeafm.afm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.md.Metric; import com.gooddata.util.GoodDataToStringBuilder; import java.util.ArrayList; @@ -20,7 +21,7 @@ import java.util.Objects; import java.util.Optional; -import static com.gooddata.executeafm.afm.SimpleMeasureDefinition.NAME; +import static com.gooddata.sdk.model.executeafm.afm.SimpleMeasureDefinition.NAME; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; @@ -120,7 +121,7 @@ public String getUri() { } /** - * Returns the qualifier used by the {@link com.gooddata.md.Metric}. + * Returns the qualifier used by the {@link Metric}. * * @return qualifier used by the metric, which is its {@link #item}. The null is returned in case when {@link #item} was not set. * diff --git a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/AttributeHeader.java similarity index 93% rename from src/main/java/com/gooddata/executeafm/response/AttributeHeader.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/AttributeHeader.java index 6e665134f..7a84a6d74 100644 --- a/src/main/java/com/gooddata/executeafm/response/AttributeHeader.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/AttributeHeader.java @@ -1,15 +1,16 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.afm.Afm; -import com.gooddata.executeafm.afm.LocallyIdentifiable; +import com.gooddata.sdk.model.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.afm.LocallyIdentifiable; +import com.gooddata.sdk.model.executeafm.afm.AttributeItem; import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -120,7 +121,7 @@ public String getName() { } /** - * Local identifier referencing header's {@link com.gooddata.executeafm.afm.AttributeItem} + * Local identifier referencing header's {@link AttributeItem} * within {@link Afm} * @return attribute's local identifier */ diff --git a/src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/AttributeInHeader.java similarity index 95% rename from src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/AttributeInHeader.java index 49f800807..e1d454bb1 100644 --- a/src/main/java/com/gooddata/executeafm/response/AttributeInHeader.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/AttributeInHeader.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/ExecutionResponse.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/ExecutionResponse.java index 3e2f8d7ac..047011a25 100644 --- a/src/main/java/com/gooddata/executeafm/response/ExecutionResponse.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/ExecutionResponse.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -11,6 +11,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.sdk.model.executeafm.Execution; +import com.gooddata.sdk.model.executeafm.result.ExecutionResult; import com.gooddata.util.GoodDataToStringBuilder; import java.util.LinkedHashMap; @@ -23,8 +25,8 @@ import static org.apache.commons.lang3.ArrayUtils.toObject; /** - * Represents response on {@link com.gooddata.executeafm.Execution} request. - * Provides the dimensions with headers and the (polling) uri to {@link com.gooddata.executeafm.result.ExecutionResult} + * Represents response on {@link Execution} request. + * Provides the dimensions with headers and the (polling) uri to {@link ExecutionResult} * (so called dataResult). */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) diff --git a/src/main/java/com/gooddata/executeafm/response/Header.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/Header.java similarity index 79% rename from src/main/java/com/gooddata/executeafm/response/Header.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/Header.java index 6a518e6f1..cb6f82ea9 100644 --- a/src/main/java/com/gooddata/executeafm/response/Header.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/Header.java @@ -1,16 +1,13 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.gooddata.util.GoodDataToStringBuilder; - -import java.util.List; /** * {@link ResultDimension}'s header. diff --git a/src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/MeasureGroupHeader.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/MeasureGroupHeader.java index 7231c2372..ad72cb520 100644 --- a/src/main/java/com/gooddata/executeafm/response/MeasureGroupHeader.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/MeasureGroupHeader.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/response/MeasureHeaderItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/MeasureHeaderItem.java similarity index 89% rename from src/main/java/com/gooddata/executeafm/response/MeasureHeaderItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/MeasureHeaderItem.java index 6fa020687..7582aa6d0 100644 --- a/src/main/java/com/gooddata/executeafm/response/MeasureHeaderItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/MeasureHeaderItem.java @@ -1,17 +1,18 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.executeafm.afm.Afm; -import com.gooddata.executeafm.afm.LocallyIdentifiable; +import com.gooddata.sdk.model.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.afm.LocallyIdentifiable; +import com.gooddata.sdk.model.executeafm.afm.MeasureItem; import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notEmpty; @@ -65,7 +66,7 @@ public String getFormat() { } /** - * Local identifier, referencing the {@link com.gooddata.executeafm.afm.MeasureItem} + * Local identifier, referencing the {@link MeasureItem} * in {@link Afm} * @return local identifier */ diff --git a/src/main/java/com/gooddata/executeafm/response/ResultDimension.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/ResultDimension.java similarity index 83% rename from src/main/java/com/gooddata/executeafm/response/ResultDimension.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/ResultDimension.java index 0e803e8cb..5f7e4a3d4 100644 --- a/src/main/java/com/gooddata/executeafm/response/ResultDimension.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/ResultDimension.java @@ -1,13 +1,14 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.sdk.model.executeafm.result.ExecutionResult; import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -15,7 +16,7 @@ import static java.util.Arrays.asList; /** - * Describes single dimension of the {@link com.gooddata.executeafm.result.ExecutionResult}. + * Describes single dimension of the {@link ExecutionResult}. */ @JsonInclude(JsonInclude.Include.NON_NULL) public class ResultDimension { diff --git a/src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/TotalHeaderItem.java similarity index 88% rename from src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/TotalHeaderItem.java index 271f1fc99..c86bd1e49 100644 --- a/src/main/java/com/gooddata/executeafm/response/TotalHeaderItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/response/TotalHeaderItem.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.response; +package com.gooddata.sdk.model.executeafm.response; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.md.report.Total; +import com.gooddata.sdk.model.md.report.Total; import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/AttributeHeaderItem.java similarity index 77% rename from src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/AttributeHeaderItem.java index 012ef3eee..b82cd8918 100644 --- a/src/main/java/com/gooddata/executeafm/result/AttributeHeaderItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/AttributeHeaderItem.java @@ -1,19 +1,16 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.util.GoodDataToStringBuilder; -import static com.gooddata.executeafm.result.AttributeHeaderItem.NAME; +import static com.gooddata.sdk.model.executeafm.result.AttributeHeaderItem.NAME; /** * Header item for attribute diff --git a/src/main/java/com/gooddata/executeafm/result/Data.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Data.java similarity index 96% rename from src/main/java/com/gooddata/executeafm/result/Data.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Data.java index edc8e821b..8adee2ab0 100644 --- a/src/main/java/com/gooddata/executeafm/result/Data.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Data.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/com/gooddata/executeafm/result/DataList.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/DataList.java similarity index 91% rename from src/main/java/com/gooddata/executeafm/result/DataList.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/DataList.java index 762261ceb..f281ed546 100644 --- a/src/main/java/com/gooddata/executeafm/result/DataList.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/DataList.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.gooddata.util.GoodDataToStringBuilder; @@ -44,7 +44,7 @@ public DataList(final List values) { } private static Data simpleValue(final String value) { - return value == null ? Data.NULL : new DataValue(value); + return value == null ? NULL : new DataValue(value); } @Override diff --git a/src/main/java/com/gooddata/executeafm/result/DataValue.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/DataValue.java similarity index 77% rename from src/main/java/com/gooddata/executeafm/result/DataValue.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/DataValue.java index 9093c8d43..fb8087fe2 100644 --- a/src/main/java/com/gooddata/executeafm/result/DataValue.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/DataValue.java @@ -1,20 +1,13 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonValue; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.gooddata.util.GoodDataToStringBuilder; -import java.io.IOException; - import static com.gooddata.util.Validate.notNull; /** diff --git a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ExecutionResult.java similarity index 96% rename from src/main/java/com/gooddata/executeafm/result/ExecutionResult.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ExecutionResult.java index 243884d34..4b6bff7af 100644 --- a/src/main/java/com/gooddata/executeafm/result/ExecutionResult.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ExecutionResult.java @@ -1,15 +1,16 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.sdk.model.executeafm.Execution; import com.gooddata.util.GoodDataToStringBuilder; import java.util.ArrayList; @@ -18,7 +19,7 @@ import static com.gooddata.util.Validate.notNull; /** - * Data result of the {@link com.gooddata.executeafm.Execution}. + * Data result of the {@link Execution}. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("executionResult") diff --git a/src/main/java/com/gooddata/executeafm/result/Paging.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Paging.java similarity index 95% rename from src/main/java/com/gooddata/executeafm/result/Paging.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Paging.java index b73a2053b..ab6dbea52 100644 --- a/src/main/java/com/gooddata/executeafm/result/Paging.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Paging.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultHeaderItem.java similarity index 91% rename from src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultHeaderItem.java index bd0e727fb..de7d98cc3 100644 --- a/src/main/java/com/gooddata/executeafm/result/ResultHeaderItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultHeaderItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultMeasureHeaderItem.java similarity index 83% rename from src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultMeasureHeaderItem.java index 4fd098f89..cbf241196 100644 --- a/src/main/java/com/gooddata/executeafm/result/ResultMeasureHeaderItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultMeasureHeaderItem.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import static com.gooddata.executeafm.result.ResultMeasureHeaderItem.NAME; +import static com.gooddata.sdk.model.executeafm.result.ResultMeasureHeaderItem.NAME; /** * Header item for measure diff --git a/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultTotalHeaderItem.java similarity index 88% rename from src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultTotalHeaderItem.java index 40eaa7ba4..82501c1c3 100644 --- a/src/main/java/com/gooddata/executeafm/result/ResultTotalHeaderItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/ResultTotalHeaderItem.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.md.report.Total; +import com.gooddata.sdk.model.md.report.Total; -import static com.gooddata.executeafm.result.ResultTotalHeaderItem.NAME; +import static com.gooddata.sdk.model.executeafm.result.ResultTotalHeaderItem.NAME; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/executeafm/result/Warning.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Warning.java similarity index 96% rename from src/main/java/com/gooddata/executeafm/result/Warning.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Warning.java index 845bc4eb4..1af221c0d 100644 --- a/src/main/java/com/gooddata/executeafm/result/Warning.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/result/Warning.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.result; +package com.gooddata.sdk.model.executeafm.result; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/AttributeLocatorItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeLocatorItem.java similarity index 92% rename from src/main/java/com/gooddata/executeafm/resultspec/AttributeLocatorItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeLocatorItem.java index 773204dd7..fd53efbdc 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/AttributeLocatorItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeLocatorItem.java @@ -1,10 +1,10 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeSortAggregation.java similarity index 82% rename from src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeSortAggregation.java index e239c43ec..58f7a252a 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortAggregation.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeSortAggregation.java @@ -1,10 +1,10 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeSortItem.java similarity index 96% rename from src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeSortItem.java index efd78ce32..2e91d52cd 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/AttributeSortItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/AttributeSortItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/Dimension.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/Dimension.java similarity index 94% rename from src/main/java/com/gooddata/executeafm/resultspec/Dimension.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/Dimension.java index 5cba7e09d..f9fef6538 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/Dimension.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/Dimension.java @@ -1,14 +1,14 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.afm.Afm; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collections; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/Direction.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/Direction.java similarity index 74% rename from src/main/java/com/gooddata/executeafm/resultspec/Direction.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/Direction.java index 6667e0364..f95b6e463 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/Direction.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/Direction.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/LocatorItem.java similarity index 87% rename from src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/LocatorItem.java index 3e20e279a..0a10b0eec 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/LocatorItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/LocatorItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/MeasureLocatorItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/MeasureLocatorItem.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/resultspec/MeasureLocatorItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/MeasureLocatorItem.java index d912c287c..c767499c9 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/MeasureLocatorItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/MeasureLocatorItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/MeasureSortItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/MeasureSortItem.java similarity index 93% rename from src/main/java/com/gooddata/executeafm/resultspec/MeasureSortItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/MeasureSortItem.java index 07c3fea35..3fd10675a 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/MeasureSortItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/MeasureSortItem.java @@ -1,10 +1,10 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/ResultSpec.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/ResultSpec.java similarity index 91% rename from src/main/java/com/gooddata/executeafm/resultspec/ResultSpec.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/ResultSpec.java index bd8e73436..dca3946f2 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/ResultSpec.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/ResultSpec.java @@ -1,14 +1,14 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.afm.Afm; import com.gooddata.util.GoodDataToStringBuilder; import java.util.ArrayList; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/SortItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/SortItem.java similarity index 84% rename from src/main/java/com/gooddata/executeafm/resultspec/SortItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/SortItem.java index 3111af99f..bac702583 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/SortItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/SortItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/TotalItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/TotalItem.java similarity index 89% rename from src/main/java/com/gooddata/executeafm/resultspec/TotalItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/TotalItem.java index 2efcde570..158dc6b7c 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/TotalItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/TotalItem.java @@ -1,11 +1,13 @@ /* - * Copyright (C) 2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.md.report.Total; +import com.gooddata.sdk.model.md.report.Total; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Objects; diff --git a/src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/TotalLocatorItem.java similarity index 90% rename from src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/TotalLocatorItem.java index cda7ea269..005338567 100644 --- a/src/main/java/com/gooddata/executeafm/resultspec/TotalLocatorItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/executeafm/resultspec/TotalLocatorItem.java @@ -1,10 +1,10 @@ /* - * Copyright (C) 2004-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.executeafm.resultspec; +package com.gooddata.sdk.model.executeafm.resultspec; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/export/ClientExport.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ClientExport.java similarity index 83% rename from src/main/java/com/gooddata/export/ClientExport.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ClientExport.java index 975716d7b..e87ffc673 100644 --- a/src/main/java/com/gooddata/export/ClientExport.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ClientExport.java @@ -1,14 +1,13 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.export; +package com.gooddata.sdk.model.export; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.GoodDataEndpoint; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; @@ -18,7 +17,7 @@ @JsonTypeName("clientExport") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonInclude(JsonInclude.Include.NON_NULL) -class ClientExport { +public class ClientExport { private static final String DASHBOARD_EXPORT_URI = "/dashboard.html#project={projectUri}&dashboard={dashboardUri}&tab={tabId}&export=1"; private static final UriTemplate DASHBOARD_EXPORT_TEMPLATE = new UriTemplate(DASHBOARD_EXPORT_URI); @@ -31,8 +30,9 @@ class ClientExport { this.name = notEmpty(name, "name"); } - ClientExport(final GoodDataEndpoint endpoint, final String projectUri, final String dashboardUri, final String tabId) { - this(notNull(endpoint, "endpoint").toUri() + + public ClientExport(final String goodDataEndpointUri, final String projectUri, final String dashboardUri, + final String tabId) { + this(notEmpty(goodDataEndpointUri, "goodDataEndpointUri") + DASHBOARD_EXPORT_TEMPLATE .expand( notNull(projectUri, "projectUri"), diff --git a/src/main/java/com/gooddata/export/ExecuteReport.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExecuteReport.java similarity index 86% rename from src/main/java/com/gooddata/export/ExecuteReport.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExecuteReport.java index f756a2acc..dde861161 100644 --- a/src/main/java/com/gooddata/export/ExecuteReport.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExecuteReport.java @@ -1,13 +1,13 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.export; +package com.gooddata.sdk.model.export; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.md.report.Report; +import com.gooddata.sdk.model.md.report.Report; import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/export/ExecuteReportDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExecuteReportDefinition.java similarity index 88% rename from src/main/java/com/gooddata/export/ExecuteReportDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExecuteReportDefinition.java index fe3ea0c8e..275d4fb88 100644 --- a/src/main/java/com/gooddata/export/ExecuteReportDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExecuteReportDefinition.java @@ -1,13 +1,13 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.export; +package com.gooddata.sdk.model.export; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.md.report.ReportDefinition; +import com.gooddata.sdk.model.md.report.ReportDefinition; import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/export/ExportFormat.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExportFormat.java similarity index 84% rename from src/main/java/com/gooddata/export/ExportFormat.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExportFormat.java index 6a01c1d0f..815dd02bf 100644 --- a/src/main/java/com/gooddata/export/ExportFormat.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ExportFormat.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.export; +package com.gooddata.sdk.model.export; import java.util.stream.Stream; diff --git a/src/main/java/com/gooddata/export/ReportRequest.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ReportRequest.java similarity index 87% rename from src/main/java/com/gooddata/export/ReportRequest.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ReportRequest.java index 290495c06..7f067c3b2 100644 --- a/src/main/java/com/gooddata/export/ReportRequest.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/export/ReportRequest.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.export; +package com.gooddata.sdk.model.export; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlag.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/FeatureFlag.java similarity index 93% rename from src/main/java/com/gooddata/featureflag/FeatureFlag.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/FeatureFlag.java index 570f61baa..70da4530c 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlag.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/FeatureFlag.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.featureflag; +package com.gooddata.sdk.model.featureflag; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/FeatureFlags.java similarity index 97% rename from src/main/java/com/gooddata/featureflag/FeatureFlags.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/FeatureFlags.java index a32ad001b..36b84e72c 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/FeatureFlags.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.featureflag; +package com.gooddata.sdk.model.featureflag; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/ProjectFeatureFlag.java similarity index 97% rename from src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/ProjectFeatureFlag.java index 05a5349c7..1caa12b07 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/ProjectFeatureFlag.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.featureflag; +package com.gooddata.sdk.model.featureflag; import com.fasterxml.jackson.annotation.*; import com.gooddata.util.GoodDataToStringBuilder; diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/ProjectFeatureFlags.java similarity index 92% rename from src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/ProjectFeatureFlags.java index 5b895a497..637acd430 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/featureflag/ProjectFeatureFlags.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.featureflag; +package com.gooddata.sdk.model.featureflag; import com.fasterxml.jackson.annotation.*; -import com.gooddata.project.Project; +import com.gooddata.sdk.model.project.Project; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/gdc/AboutLinks.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AboutLinks.java similarity index 96% rename from src/main/java/com/gooddata/gdc/AboutLinks.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AboutLinks.java index ad9fbbbb8..fec50ff18 100644 --- a/src/main/java/com/gooddata/gdc/AboutLinks.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AboutLinks.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.*; import com.gooddata.util.GoodDataToStringBuilder; diff --git a/src/main/java/com/gooddata/gdc/AbstractMaql.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AbstractMaql.java similarity index 91% rename from src/main/java/com/gooddata/gdc/AbstractMaql.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AbstractMaql.java index a6ff218df..36ec32e71 100644 --- a/src/main/java/com/gooddata/gdc/AbstractMaql.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AbstractMaql.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/gdc/AsyncTask.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AsyncTask.java similarity index 93% rename from src/main/java/com/gooddata/gdc/AsyncTask.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AsyncTask.java index bea429891..60388ee5d 100644 --- a/src/main/java/com/gooddata/gdc/AsyncTask.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/AsyncTask.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/Gdc.java similarity index 83% rename from src/main/java/com/gooddata/gdc/Gdc.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/Gdc.java index d4aa4db54..16aeb7f0a 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/Gdc.java @@ -1,13 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.gdc.AboutLinks.Link; import java.util.List; diff --git a/src/main/java/com/gooddata/gdc/LinkEntries.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/LinkEntries.java similarity index 94% rename from src/main/java/com/gooddata/gdc/LinkEntries.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/LinkEntries.java index 3c36f3cb2..9b96fb37f 100644 --- a/src/main/java/com/gooddata/gdc/LinkEntries.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/LinkEntries.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/gdc/RootLinks.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/RootLinks.java similarity index 99% rename from src/main/java/com/gooddata/gdc/RootLinks.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/RootLinks.java index 2347ac585..caeb5851f 100644 --- a/src/main/java/com/gooddata/gdc/RootLinks.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/RootLinks.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/TaskStatus.java similarity index 93% rename from src/main/java/com/gooddata/gdc/TaskStatus.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/TaskStatus.java index 652a58bc3..2d9be6dde 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/TaskStatus.java @@ -1,15 +1,16 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.gdc.GdcError; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/UriResponse.java similarity index 91% rename from src/main/java/com/gooddata/gdc/UriResponse.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/UriResponse.java index f7b36611a..3cfa0fb3b 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/gdc/UriResponse.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.gdc; +package com.gooddata.sdk.model.gdc; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/lcm/LcmEntities.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/lcm/LcmEntities.java similarity index 95% rename from src/main/java/com/gooddata/lcm/LcmEntities.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/lcm/LcmEntities.java index 8e1e7bff3..b00ac17c5 100644 --- a/src/main/java/com/gooddata/lcm/LcmEntities.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/lcm/LcmEntities.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.lcm; +package com.gooddata.sdk.model.lcm; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/lcm/LcmEntity.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/lcm/LcmEntity.java similarity index 90% rename from src/main/java/com/gooddata/lcm/LcmEntity.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/lcm/LcmEntity.java index 5d753a9d7..8c421a802 100644 --- a/src/main/java/com/gooddata/lcm/LcmEntity.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/lcm/LcmEntity.java @@ -1,30 +1,31 @@ /* - * Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.lcm; +package com.gooddata.sdk.model.lcm; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.sdk.model.project.Project; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Map; import java.util.Objects; -import static com.gooddata.lcm.LcmEntity.LinkCategory.CLIENT; -import static com.gooddata.lcm.LcmEntity.LinkCategory.DATA_PRODUCT; -import static com.gooddata.lcm.LcmEntity.LinkCategory.PROJECT; -import static com.gooddata.lcm.LcmEntity.LinkCategory.SEGMENT; +import static com.gooddata.sdk.model.lcm.LcmEntity.LinkCategory.CLIENT; +import static com.gooddata.sdk.model.lcm.LcmEntity.LinkCategory.DATA_PRODUCT; +import static com.gooddata.sdk.model.lcm.LcmEntity.LinkCategory.PROJECT; +import static com.gooddata.sdk.model.lcm.LcmEntity.LinkCategory.SEGMENT; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static com.gooddata.util.Validate.notNullState; /** - * Single Life Cycle Management entity representing the relation between {@link com.gooddata.project.Project}, + * Single Life Cycle Management entity representing the relation between {@link Project}, * Client, Segment and DataProduct. */ @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AbstractObj.java similarity index 97% rename from src/main/java/com/gooddata/md/AbstractObj.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AbstractObj.java index 153b939be..2d01b1b79 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AbstractObj.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/Attachment.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Attachment.java similarity index 94% rename from src/main/java/com/gooddata/md/Attachment.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Attachment.java index 60f9b0994..79ed1a969 100644 --- a/src/main/java/com/gooddata/md/Attachment.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Attachment.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/Attribute.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Attribute.java similarity index 92% rename from src/main/java/com/gooddata/md/Attribute.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Attribute.java index 9cfc72f09..dd62e4ab0 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Attribute.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import static java.util.Arrays.asList; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeDisplayForm.java similarity index 96% rename from src/main/java/com/gooddata/md/AttributeDisplayForm.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeDisplayForm.java index a199c5c7e..afbad060f 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeDisplayForm.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; diff --git a/src/main/java/com/gooddata/md/AttributeElement.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeElement.java similarity index 94% rename from src/main/java/com/gooddata/md/AttributeElement.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeElement.java index 038a0799a..b0d840824 100644 --- a/src/main/java/com/gooddata/md/AttributeElement.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeElement.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeElements.java similarity index 93% rename from src/main/java/com/gooddata/md/AttributeElements.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeElements.java index a4b0848f3..e27ca1689 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeElements.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -25,7 +25,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class AttributeElements { +public class AttributeElements { static final String URI = Obj.OBJ_URI + "/elements"; static final UriTemplate TEMPLATE = new UriTemplate(URI); diff --git a/src/main/java/com/gooddata/md/AttributeSort.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeSort.java similarity index 96% rename from src/main/java/com/gooddata/md/AttributeSort.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeSort.java index 380485684..4aeab2986 100644 --- a/src/main/java/com/gooddata/md/AttributeSort.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/AttributeSort.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/md/BulkGet.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/BulkGet.java similarity index 90% rename from src/main/java/com/gooddata/md/BulkGet.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/BulkGet.java index 9d0b4574c..815ea1675 100644 --- a/src/main/java/com/gooddata/md/BulkGet.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/BulkGet.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -22,7 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class BulkGet { +public class BulkGet { public static final String URI = "/gdc/md/{projectId}/objects/get"; diff --git a/src/main/java/com/gooddata/md/BulkGetUris.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/BulkGetUris.java similarity index 88% rename from src/main/java/com/gooddata/md/BulkGetUris.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/BulkGetUris.java index ccede5202..cb19c7410 100644 --- a/src/main/java/com/gooddata/md/BulkGetUris.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/BulkGetUris.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -20,11 +20,11 @@ */ @JsonTypeName("get") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -class BulkGetUris { +public class BulkGetUris { private final Collection items; - BulkGetUris(Collection items) { + public BulkGetUris(Collection items) { notNull(items, "items"); this.items = items; } diff --git a/src/main/java/com/gooddata/md/Column.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Column.java similarity index 97% rename from src/main/java/com/gooddata/md/Column.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Column.java index 604b9499e..979a4ca52 100644 --- a/src/main/java/com/gooddata/md/Column.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Column.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/DashboardAttachment.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DashboardAttachment.java similarity index 96% rename from src/main/java/com/gooddata/md/DashboardAttachment.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DashboardAttachment.java index 24e7a36a4..691c9946c 100644 --- a/src/main/java/com/gooddata/md/DashboardAttachment.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DashboardAttachment.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DataLoadingColumn.java similarity index 97% rename from src/main/java/com/gooddata/md/DataLoadingColumn.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DataLoadingColumn.java index c98d092ea..611b6234f 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DataLoadingColumn.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.gooddata.gdc.UriResponse; +import com.gooddata.sdk.model.gdc.UriResponse; import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.GoodDataToStringBuilder; diff --git a/src/main/java/com/gooddata/md/Dataset.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Dataset.java similarity index 98% rename from src/main/java/com/gooddata/md/Dataset.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Dataset.java index 29a7bc14a..14e1baf86 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Dataset.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import static com.gooddata.util.Validate.notNullState; diff --git a/src/main/java/com/gooddata/md/Dimension.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Dimension.java similarity index 95% rename from src/main/java/com/gooddata/md/Dimension.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Dimension.java index 43d161031..09540e891 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Dimension.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DisplayForm.java similarity index 97% rename from src/main/java/com/gooddata/md/DisplayForm.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DisplayForm.java index a4676467c..5cb0dc2c0 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/DisplayForm.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/md/Entry.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Entry.java similarity index 96% rename from src/main/java/com/gooddata/md/Entry.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Entry.java index 7a3c6bb51..003e3b3e5 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Entry.java @@ -1,11 +1,13 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.*; +import com.gooddata.sdk.model.util.TagsDeserializer; +import com.gooddata.sdk.model.util.TagsSerializer; import com.gooddata.util.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; diff --git a/src/main/java/com/gooddata/md/Expression.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Expression.java similarity index 92% rename from src/main/java/com/gooddata/md/Expression.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Expression.java index 9f2e13ae7..2e2337ed5 100644 --- a/src/main/java/com/gooddata/md/Expression.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Expression.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/Fact.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Fact.java similarity index 96% rename from src/main/java/com/gooddata/md/Fact.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Fact.java index 737509f56..a64c843fb 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Fact.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifierAndUri.java similarity index 89% rename from src/main/java/com/gooddata/md/IdentifierAndUri.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifierAndUri.java index 824b49e7d..2a905f9e6 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifierAndUri.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifierToUri.java similarity index 86% rename from src/main/java/com/gooddata/md/IdentifierToUri.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifierToUri.java index ad3151c2b..39c86600e 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifierToUri.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.util.GoodDataToStringBuilder; @@ -16,11 +16,11 @@ * Structure with list of symbolic names (identifiers) to be expanded to list of URIs. * Serialization only. */ -class IdentifierToUri { +public class IdentifierToUri { private final Collection identifiers; - IdentifierToUri(final Collection identifiers) { + public IdentifierToUri(final Collection identifiers) { notNull(identifiers, "identifiers"); this.identifiers = identifiers; } diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifiersAndUris.java similarity index 91% rename from src/main/java/com/gooddata/md/IdentifiersAndUris.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifiersAndUris.java index d941d9fb5..8f2ff9dda 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/IdentifiersAndUris.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -16,7 +16,7 @@ * Encapsulates list of identifiers and their URIs. * Deserialization only. */ -class IdentifiersAndUris { +public class IdentifiersAndUris { public static final String URI = "/gdc/md/{projectId}/identifiers"; diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/InUseMany.java similarity index 96% rename from src/main/java/com/gooddata/md/InUseMany.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/InUseMany.java index 6d4bac964..8138f80ec 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/InUseMany.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanDeserializer; @@ -33,7 +33,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class InUseMany { +public class InUseMany { public static final String USEDBY_URI = "/gdc/md/{projectId}/usedby2"; diff --git a/src/main/java/com/gooddata/md/Key.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Key.java similarity index 92% rename from src/main/java/com/gooddata/md/Key.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Key.java index 36c897703..4cb480e0a 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Key.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/MaqlAst.java similarity index 95% rename from src/main/java/com/gooddata/md/MaqlAst.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/MaqlAst.java index fd950630f..f0168adad 100644 --- a/src/main/java/com/gooddata/md/MaqlAst.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/MaqlAst.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/md/Meta.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Meta.java similarity index 98% rename from src/main/java/com/gooddata/md/Meta.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Meta.java index 9633059bc..388f4332e 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Meta.java @@ -1,14 +1,16 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; +import com.gooddata.sdk.model.util.TagsDeserializer; +import com.gooddata.sdk.model.util.TagsSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -18,8 +20,6 @@ import com.gooddata.util.GDDateTimeDeserializer; import com.gooddata.util.GDDateTimeSerializer; import com.gooddata.util.GoodDataToStringBuilder; -import com.gooddata.util.TagsDeserializer; -import com.gooddata.util.TagsSerializer; import org.joda.time.DateTime; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/md/Metric.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Metric.java similarity index 97% rename from src/main/java/com/gooddata/md/Metric.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Metric.java index 853c660bb..6d83bca8a 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Metric.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/NestedAttribute.java similarity index 98% rename from src/main/java/com/gooddata/md/NestedAttribute.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/NestedAttribute.java index 05719f6b2..0e62267c0 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/NestedAttribute.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.*; import com.gooddata.util.GoodDataToStringBuilder; diff --git a/src/main/java/com/gooddata/md/Obj.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Obj.java similarity index 82% rename from src/main/java/com/gooddata/md/Obj.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Obj.java index 62f036f99..dcada8a04 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Obj.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.gooddata.md.report.Report; -import com.gooddata.md.report.ReportDefinition; -import com.gooddata.md.visualization.VisualizationClass; -import com.gooddata.md.visualization.VisualizationObject; +import com.gooddata.sdk.model.md.report.Report; +import com.gooddata.sdk.model.md.report.ReportDefinition; +import com.gooddata.sdk.model.md.visualization.VisualizationClass; +import com.gooddata.sdk.model.md.visualization.VisualizationObject; import org.springframework.web.util.UriTemplate; /** diff --git a/src/main/java/com/gooddata/md/ProjectDashboard.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ProjectDashboard.java similarity index 97% rename from src/main/java/com/gooddata/md/ProjectDashboard.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ProjectDashboard.java index dcd3521d9..bae7b11e7 100644 --- a/src/main/java/com/gooddata/md/ProjectDashboard.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ProjectDashboard.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; diff --git a/src/main/java/com/gooddata/md/Query.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Query.java similarity index 96% rename from src/main/java/com/gooddata/md/Query.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Query.java index 5fa715c09..fe6d6677e 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Query.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/Queryable.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Queryable.java similarity index 76% rename from src/main/java/com/gooddata/md/Queryable.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Queryable.java index 058e7f7ab..6e7ed8434 100644 --- a/src/main/java/com/gooddata/md/Queryable.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Queryable.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; /** * Marker interface for metadata objects which can be found using query resource (see MetadataService.find* methods). diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ReportAttachment.java similarity index 96% rename from src/main/java/com/gooddata/md/ReportAttachment.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ReportAttachment.java index 79c398a4d..d90707d9d 100644 --- a/src/main/java/com/gooddata/md/ReportAttachment.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ReportAttachment.java @@ -1,13 +1,13 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.export.ExportFormat; +import com.gooddata.sdk.model.export.ExportFormat; import com.gooddata.util.GoodDataToStringBuilder; import java.util.Arrays; diff --git a/src/main/java/com/gooddata/md/Restriction.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Restriction.java similarity index 93% rename from src/main/java/com/gooddata/md/Restriction.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Restriction.java index aedf780a2..f72887841 100644 --- a/src/main/java/com/gooddata/md/Restriction.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Restriction.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.gooddata.util.GoodDataToStringBuilder; @@ -64,7 +64,7 @@ public String toString() { return GoodDataToStringBuilder.defaultToString(this); } - enum Type { + public enum Type { IDENTIFIER, TITLE, SUMMARY } } diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ScheduledMail.java similarity index 97% rename from src/main/java/com/gooddata/md/ScheduledMail.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ScheduledMail.java index f5c712c63..ce826d153 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ScheduledMail.java @@ -1,14 +1,14 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.*; -import com.gooddata.export.ExportFormat; -import com.gooddata.md.report.ReportDefinition; -import com.gooddata.report.ReportExportFormat; +import com.gooddata.sdk.model.export.ExportFormat; +import com.gooddata.sdk.model.md.report.ReportDefinition; +import com.gooddata.sdk.model.report.ReportExportFormat; import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.LocalDate; diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ScheduledMailWhen.java similarity index 95% rename from src/main/java/com/gooddata/md/ScheduledMailWhen.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ScheduledMailWhen.java index 801303e3c..74d1f5653 100644 --- a/src/main/java/com/gooddata/md/ScheduledMailWhen.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/ScheduledMailWhen.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.GDDateDeserializer; @@ -18,7 +18,7 @@ import java.io.Serializable; /** - * Represents the start date and cron-like expression for {@link com.gooddata.md.ScheduledMail} mail schedule. + * Represents the start date and cron-like expression for {@link ScheduledMail} mail schedule. */ public class ScheduledMailWhen implements Serializable { diff --git a/src/main/java/com/gooddata/md/Table.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Table.java similarity index 96% rename from src/main/java/com/gooddata/md/Table.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Table.java index cf0811e69..fafbc766f 100644 --- a/src/main/java/com/gooddata/md/Table.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Table.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/TableDataLoad.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/TableDataLoad.java similarity index 96% rename from src/main/java/com/gooddata/md/TableDataLoad.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/TableDataLoad.java index 824d17fa0..a93083f47 100644 --- a/src/main/java/com/gooddata/md/TableDataLoad.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/TableDataLoad.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/Updatable.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Updatable.java similarity index 76% rename from src/main/java/com/gooddata/md/Updatable.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Updatable.java index 59fd60e1c..e27b62dcf 100644 --- a/src/main/java/com/gooddata/md/Updatable.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Updatable.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; /** * Marker interface for metadata objects which can be updated. (see {@link MetadataService#updateObj(Updatable)}). diff --git a/src/main/java/com/gooddata/md/Usage.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Usage.java similarity index 83% rename from src/main/java/com/gooddata/md/Usage.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Usage.java index 90ae129a4..688f123a7 100644 --- a/src/main/java/com/gooddata/md/Usage.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Usage.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.gooddata.util.GoodDataToStringBuilder; @@ -23,7 +23,7 @@ public class Usage { * @param uri object URI * @param usedBy using objects */ - Usage(final String uri, final Collection usedBy) { + public Usage(final String uri, final Collection usedBy) { this.uri = uri; this.usedBy = usedBy; } diff --git a/src/main/java/com/gooddata/md/UseMany.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/UseMany.java similarity index 82% rename from src/main/java/com/gooddata/md/UseMany.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/UseMany.java index c440f8b4a..77897c76c 100644 --- a/src/main/java/com/gooddata/md/UseMany.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/UseMany.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -20,12 +20,12 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class UseMany { +public class UseMany { private final Collection useMany; @JsonCreator - UseMany(@JsonProperty("useMany") final Collection useMany) { + private UseMany(@JsonProperty("useMany") final Collection useMany) { this.useMany = notNull(useMany, "useMany"); } diff --git a/src/main/java/com/gooddata/md/UseManyEntries.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/UseManyEntries.java similarity index 89% rename from src/main/java/com/gooddata/md/UseManyEntries.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/UseManyEntries.java index 059c22b69..438504e43 100644 --- a/src/main/java/com/gooddata/md/UseManyEntries.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/UseManyEntries.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md; +package com.gooddata.sdk.model.md; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -15,7 +15,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class UseManyEntries { +public class UseManyEntries { private final String uri; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdArtifact.java similarity index 85% rename from src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdArtifact.java index 1e5693d3e..d399b6ec5 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdArtifact.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.maintenance; +package com.gooddata.sdk.model.md.maintenance; import com.fasterxml.jackson.annotation.*; -import com.gooddata.gdc.UriResponse; +import com.gooddata.sdk.model.gdc.UriResponse; import com.gooddata.util.GoodDataToStringBuilder; /** @@ -16,7 +16,7 @@ @JsonTypeName("partialMDArtifact") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonInclude(JsonInclude.Include.NON_NULL) -class PartialMdArtifact { +public class PartialMdArtifact { private final UriResponse status; private final String token; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdExport.java similarity index 96% rename from src/main/java/com/gooddata/md/maintenance/PartialMdExport.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdExport.java index f2a5bb744..612967cfb 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdExport.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.maintenance; +package com.gooddata.sdk.model.md.maintenance; import static com.gooddata.util.Validate.notEmpty; import static java.util.Arrays.asList; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdExportToken.java similarity index 95% rename from src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdExportToken.java index 78cb7b444..47ba12a3d 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/maintenance/PartialMdExportToken.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.maintenance; +package com.gooddata.sdk.model.md.maintenance; import static com.gooddata.util.Validate.notEmpty; @@ -56,7 +56,7 @@ public PartialMdExportToken(String token) { * @param token token identifying metadata partially exported from another project * @param importAttributeProperties see {@link #setImportAttributeProperties(boolean)} */ - PartialMdExportToken(String token, boolean importAttributeProperties) { + public PartialMdExportToken(String token, boolean importAttributeProperties) { this.token = notEmpty(token, "token"); setImportAttributeProperties(importAttributeProperties); setOverwriteNewer(true); diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/AttributeInGrid.java similarity index 96% rename from src/main/java/com/gooddata/md/report/AttributeInGrid.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/AttributeInGrid.java index d6cc56c98..8f41f917b 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/AttributeInGrid.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -12,8 +12,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.md.Attribute; -import com.gooddata.md.DisplayForm; +import com.gooddata.sdk.model.md.Attribute; +import com.gooddata.sdk.model.md.DisplayForm; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Filter.java similarity index 91% rename from src/main/java/com/gooddata/md/report/Filter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Filter.java index 40d92fd68..c8939165a 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Filter.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Grid.java similarity index 96% rename from src/main/java/com/gooddata/md/report/Grid.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Grid.java index 28e4d3dcf..e89bff124 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Grid.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/md/report/GridElement.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElement.java similarity index 74% rename from src/main/java/com/gooddata/md/report/GridElement.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElement.java index f77d89d3e..cbb547c1c 100644 --- a/src/main/java/com/gooddata/md/report/GridElement.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElement.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; /** * Grid element diff --git a/src/main/java/com/gooddata/md/report/GridElementDeserializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElementDeserializer.java similarity index 87% rename from src/main/java/com/gooddata/md/report/GridElementDeserializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElementDeserializer.java index 266700a7d..5785e908a 100644 --- a/src/main/java/com/gooddata/md/report/GridElementDeserializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElementDeserializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; @@ -11,7 +11,7 @@ import java.io.IOException; -import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; +import static com.gooddata.sdk.model.md.report.MetricGroup.METRIC_GROUP; /** * Custom deserializer for {@link GridElement}'s implementations diff --git a/src/main/java/com/gooddata/md/report/GridElementSerializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElementSerializer.java similarity index 90% rename from src/main/java/com/gooddata/md/report/GridElementSerializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElementSerializer.java index a1b1c77a0..abb52245a 100644 --- a/src/main/java/com/gooddata/md/report/GridElementSerializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridElementSerializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridReportDefinitionContent.java similarity index 92% rename from src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridReportDefinitionContent.java index ccb6c77f0..ca86ebd1b 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/GridReportDefinitionContent.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/MetricElement.java similarity index 95% rename from src/main/java/com/gooddata/md/report/MetricElement.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/MetricElement.java index a80dfc895..b6863b0b6 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/MetricElement.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.md.Metric; +import com.gooddata.sdk.model.md.Metric; import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/md/report/MetricGroup.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/MetricGroup.java similarity index 92% rename from src/main/java/com/gooddata/md/report/MetricGroup.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/MetricGroup.java index 833956416..ea3765235 100644 --- a/src/main/java/com/gooddata/md/report/MetricGroup.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/MetricGroup.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/OneNumberReportDefinitionContent.java similarity index 95% rename from src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/OneNumberReportDefinitionContent.java index 47d80bd58..55cd91e26 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/OneNumberReportDefinitionContent.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/report/Report.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Report.java similarity index 87% rename from src/main/java/com/gooddata/md/report/Report.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Report.java index a416ff154..97e3d0f9f 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Report.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.md.AbstractObj; -import com.gooddata.md.Meta; -import com.gooddata.md.Queryable; -import com.gooddata.md.Updatable; +import com.gooddata.sdk.model.md.AbstractObj; +import com.gooddata.sdk.model.md.Meta; +import com.gooddata.sdk.model.md.Queryable; +import com.gooddata.sdk.model.md.Updatable; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -18,9 +18,9 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.io.Serializable; +import java.util.Arrays; import java.util.Collection; -import static java.util.Arrays.asList; import static java.util.Collections.emptyList; /** @@ -49,7 +49,7 @@ private Report(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content */ public Report(String title, ReportDefinition... definitions) { // domains must be empty list to be included in serialized form properly - this(new Meta(title), new Content(asList(uris(definitions)), emptyList())); + this(new Meta(title), new Content(Arrays.asList(uris(definitions)), emptyList())); } @JsonIgnore diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/ReportDefinition.java similarity index 89% rename from src/main/java/com/gooddata/md/report/ReportDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/ReportDefinition.java index 0671f72ff..ff96bc317 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/ReportDefinition.java @@ -1,17 +1,17 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import static com.gooddata.util.Validate.notNullState; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.md.AbstractObj; -import com.gooddata.md.Meta; -import com.gooddata.md.Queryable; -import com.gooddata.md.Updatable; +import com.gooddata.sdk.model.md.AbstractObj; +import com.gooddata.sdk.model.md.Meta; +import com.gooddata.sdk.model.md.Queryable; +import com.gooddata.sdk.model.md.Updatable; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/ReportDefinitionContent.java similarity index 94% rename from src/main/java/com/gooddata/md/report/ReportDefinitionContent.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/ReportDefinitionContent.java index 87cf8a341..09954bce0 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/ReportDefinitionContent.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/md/report/Total.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Total.java similarity index 93% rename from src/main/java/com/gooddata/md/report/Total.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Total.java index 9b70de36a..b4089721b 100644 --- a/src/main/java/com/gooddata/md/report/Total.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/report/Total.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.report; +package com.gooddata.sdk.model.md.report; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/md/visualization/Bucket.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Bucket.java similarity index 92% rename from src/main/java/com/gooddata/md/visualization/Bucket.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Bucket.java index 4367a4397..5e3dc5c13 100644 --- a/src/main/java/com/gooddata/md/visualization/Bucket.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Bucket.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.afm.LocallyIdentifiable; +import com.gooddata.sdk.model.executeafm.afm.LocallyIdentifiable; import java.io.Serializable; import java.util.List; diff --git a/src/main/java/com/gooddata/md/visualization/BucketItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/BucketItem.java similarity index 86% rename from src/main/java/com/gooddata/md/visualization/BucketItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/BucketItem.java index e4327474c..479d92953 100644 --- a/src/main/java/com/gooddata/md/visualization/BucketItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/BucketItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/md/visualization/CollectionType.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/CollectionType.java similarity index 77% rename from src/main/java/com/gooddata/md/visualization/CollectionType.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/CollectionType.java index d50f8dcb9..3f08ad751 100644 --- a/src/main/java/com/gooddata/md/visualization/CollectionType.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/CollectionType.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; /** * Represents type of collection that can be used as local identifier for {@link Bucket} diff --git a/src/main/java/com/gooddata/md/visualization/Measure.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Measure.java similarity index 92% rename from src/main/java/com/gooddata/md/visualization/Measure.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Measure.java index 3d28a93b0..33813ab84 100644 --- a/src/main/java/com/gooddata/md/visualization/Measure.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Measure.java @@ -1,16 +1,16 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.afm.MeasureDefinition; -import com.gooddata.executeafm.afm.MeasureItem; +import com.gooddata.sdk.model.executeafm.afm.MeasureDefinition; +import com.gooddata.sdk.model.executeafm.afm.MeasureItem; import java.util.Objects; diff --git a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VOPopMeasureDefinition.java similarity index 71% rename from src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VOPopMeasureDefinition.java index 08b6647e1..ae338bd17 100644 --- a/src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VOPopMeasureDefinition.java @@ -1,27 +1,28 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.afm.PopMeasureDefinition; -import static com.gooddata.md.visualization.VOPopMeasureDefinition.NAME; +import static com.gooddata.sdk.model.md.visualization.VOPopMeasureDefinition.NAME; /** * Period over Period measure definition to be used within {@link Measure} * - * @deprecated identical with {@link com.gooddata.executeafm.afm.PopMeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 + * @deprecated identical with {@link PopMeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 */ @Deprecated @JsonInclude(JsonInclude.Include.NON_NULL) @JsonRootName(NAME) -public class VOPopMeasureDefinition extends com.gooddata.executeafm.afm.PopMeasureDefinition { +public class VOPopMeasureDefinition extends PopMeasureDefinition { private static final long serialVersionUID = -2727004914980057124L; public static final String NAME = "popMeasureDefinition"; diff --git a/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VOSimpleMeasureDefinition.java similarity index 69% rename from src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VOSimpleMeasureDefinition.java index ce8f9c83c..2080d2af6 100644 --- a/src/main/java/com/gooddata/md/visualization/VOSimpleMeasureDefinition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VOSimpleMeasureDefinition.java @@ -1,30 +1,32 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; -import com.gooddata.executeafm.ObjQualifier; -import com.gooddata.executeafm.afm.Aggregation; -import com.gooddata.executeafm.afm.FilterItem; +import com.gooddata.sdk.model.executeafm.ObjQualifier; +import com.gooddata.sdk.model.executeafm.afm.Aggregation; +import com.gooddata.sdk.model.executeafm.afm.FilterItem; +import com.gooddata.sdk.model.executeafm.afm.MeasureDefinition; +import com.gooddata.sdk.model.executeafm.afm.SimpleMeasureDefinition; import java.util.List; -import static com.gooddata.md.visualization.VOSimpleMeasureDefinition.NAME; +import static com.gooddata.sdk.model.md.visualization.VOSimpleMeasureDefinition.NAME; /** * Simple measure definition to be used within {@link Measure} - * @deprecated identical with {@link com.gooddata.executeafm.afm.MeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 + * @deprecated identical with {@link MeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581 */ @Deprecated @JsonInclude(JsonInclude.Include.NON_NULL) @JsonRootName(NAME) -public class VOSimpleMeasureDefinition extends com.gooddata.executeafm.afm.SimpleMeasureDefinition { +public class VOSimpleMeasureDefinition extends SimpleMeasureDefinition { private static final long serialVersionUID = 8467311354259963694L; public static final String NAME = "measureDefinition"; @@ -32,7 +34,7 @@ public class VOSimpleMeasureDefinition extends com.gooddata.executeafm.afm.Simpl /** * Creates instance of simple measure definition to be used in {@link VisualizationObject} * - * @see com.gooddata.executeafm.afm.SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier) + * @see SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier) */ public VOSimpleMeasureDefinition(ObjQualifier item) { super(item); @@ -56,7 +58,7 @@ public VOSimpleMeasureDefinition(@JsonProperty("item") final ObjQualifier item, /** * Creates instance of simple measure definition to be used in {@link VisualizationObject} * - * @see com.gooddata.executeafm.afm.SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier, Aggregation, Boolean, List) + * @see SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier, Aggregation, Boolean, List) */ public VOSimpleMeasureDefinition(ObjQualifier item, Aggregation aggregation, Boolean computeRatio, List filters) { super(item, aggregation, computeRatio, filters); @@ -65,7 +67,7 @@ public VOSimpleMeasureDefinition(ObjQualifier item, Aggregation aggregation, Boo /** * Creates instance of simple measure definition to be used in {@link VisualizationObject} * - * @see com.gooddata.executeafm.afm.SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier, Aggregation, Boolean, FilterItem...) + * @see SimpleMeasureDefinition#SimpleMeasureDefinition(ObjQualifier, Aggregation, Boolean, FilterItem...) */ public VOSimpleMeasureDefinition(ObjQualifier item, Aggregation aggregation, Boolean computeRatio, FilterItem... filters) { super(item, aggregation, computeRatio, filters); diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationAttribute.java similarity index 89% rename from src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationAttribute.java index 4bebd96c4..afd88aade 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationAttribute.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationAttribute.java @@ -1,15 +1,15 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.executeafm.UriObjQualifier; -import com.gooddata.executeafm.afm.AttributeItem; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.afm.AttributeItem; import java.util.Objects; diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationClass.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationClass.java similarity index 93% rename from src/main/java/com/gooddata/md/visualization/VisualizationClass.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationClass.java index 62b2121ec..40f939833 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationClass.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationClass.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -12,10 +12,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.md.AbstractObj; -import com.gooddata.md.Meta; -import com.gooddata.md.Queryable; -import com.gooddata.md.Updatable; +import com.gooddata.sdk.model.md.AbstractObj; +import com.gooddata.sdk.model.md.Meta; +import com.gooddata.sdk.model.md.Queryable; +import com.gooddata.sdk.model.md.Updatable; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationConverter.java similarity index 91% rename from src/main/java/com/gooddata/md/visualization/VisualizationConverter.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationConverter.java index d8df11f9e..14cd7ab2a 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationConverter.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationConverter.java @@ -1,41 +1,37 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; - -import static com.gooddata.executeafm.resultspec.Dimension.MEASURE_GROUP; -import static com.gooddata.md.visualization.CollectionType.SEGMENT; -import static com.gooddata.md.visualization.CollectionType.STACK; -import static com.gooddata.md.visualization.CollectionType.TREND; -import static com.gooddata.md.visualization.CollectionType.VIEW; -import static com.gooddata.util.Validate.notNull; -import static com.gooddata.util.Validate.isTrue; -import static java.util.stream.Collectors.toList; - +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.gooddata.executeafm.Execution; -import com.gooddata.executeafm.afm.Afm; -import com.gooddata.executeafm.afm.AttributeItem; -import com.gooddata.executeafm.afm.CompatibilityFilter; -import com.gooddata.executeafm.afm.DateFilter; -import com.gooddata.executeafm.afm.FilterItem; -import com.gooddata.executeafm.afm.MeasureItem; -import com.gooddata.executeafm.afm.NegativeAttributeFilter; -import com.gooddata.executeafm.afm.PositiveAttributeFilter; -import com.gooddata.executeafm.afm.SimpleMeasureDefinition; -import com.gooddata.executeafm.resultspec.Dimension; -import com.gooddata.executeafm.resultspec.ResultSpec; -import com.gooddata.executeafm.resultspec.SortItem; +import com.gooddata.sdk.model.executeafm.Execution; +import com.gooddata.sdk.model.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.afm.AttributeItem; +import com.gooddata.sdk.model.executeafm.afm.CompatibilityFilter; +import com.gooddata.sdk.model.executeafm.afm.DateFilter; +import com.gooddata.sdk.model.executeafm.afm.FilterItem; +import com.gooddata.sdk.model.executeafm.afm.MeasureItem; +import com.gooddata.sdk.model.executeafm.afm.NegativeAttributeFilter; +import com.gooddata.sdk.model.executeafm.afm.PositiveAttributeFilter; +import com.gooddata.sdk.model.executeafm.afm.SimpleMeasureDefinition; +import com.gooddata.sdk.model.executeafm.resultspec.Dimension; +import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec; +import com.gooddata.sdk.model.executeafm.resultspec.SortItem; + import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; +import static com.gooddata.sdk.model.executeafm.resultspec.Dimension.MEASURE_GROUP; +import static com.gooddata.util.Validate.isTrue; +import static com.gooddata.util.Validate.notNull; +import static java.util.stream.Collectors.toList; + /** * Helper class for converting {@link VisualizationObject} into {@link Execution} */ @@ -150,9 +146,9 @@ private static List getDimensions(final VisualizationObject visualiza switch (visualizationType) { case COLUMN: case BAR: - return getDimensionsForStacked(visualizationObject, STACK, VIEW); + return getDimensionsForStacked(visualizationObject, CollectionType.STACK, CollectionType.VIEW); case LINE: - return getDimensionsForStacked(visualizationObject, SEGMENT, TREND); + return getDimensionsForStacked(visualizationObject, CollectionType.SEGMENT, CollectionType.TREND); case PIE: return getDimensionsForPie(visualizationObject); default: diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationObject.java similarity index 93% rename from src/main/java/com/gooddata/md/visualization/VisualizationObject.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationObject.java index f07517a63..ae6384059 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationObject.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationObject.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -14,21 +14,21 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT; import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; -import static com.gooddata.md.visualization.CollectionType.*; import static java.util.Collections.emptyList; import static java.util.stream.Collectors.toList; import static org.apache.commons.lang3.Validate.notEmpty; import static org.apache.commons.lang3.Validate.notNull; -import com.gooddata.executeafm.UriObjQualifier; -import com.gooddata.executeafm.afm.Afm; -import com.gooddata.executeafm.afm.FilterItem; -import com.gooddata.executeafm.Execution; -import com.gooddata.executeafm.resultspec.ResultSpec; -import com.gooddata.md.AbstractObj; -import com.gooddata.md.Meta; -import com.gooddata.md.Queryable; -import com.gooddata.md.Updatable; +import com.gooddata.sdk.model.executeafm.UriObjQualifier; +import com.gooddata.sdk.model.executeafm.afm.Afm; +import com.gooddata.sdk.model.executeafm.afm.FilterItem; +import com.gooddata.sdk.model.executeafm.Execution; +import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec; +import com.gooddata.sdk.model.md.AbstractObj; +import com.gooddata.sdk.model.md.Meta; +import com.gooddata.sdk.model.md.Queryable; +import com.gooddata.sdk.model.md.Updatable; +import com.gooddata.sdk.model.md.*; import java.io.Serializable; import java.util.ArrayList; @@ -37,7 +37,7 @@ import java.util.function.Function; /** - * Complete information about new visualization object that can be stored as MD object (see {@link com.gooddata.md.Obj}) + * Complete information about new visualization object that can be stored as MD object (see {@link Obj}) * to md server. *

* The visualization object is part of new GD UI visualizations situated in AD and KPI dashboards. @@ -164,7 +164,7 @@ public String getItemById(String id) { */ @JsonIgnore public VisualizationAttribute getStack() { - return getAttributeFromCollection(STACK); + return getAttributeFromCollection(CollectionType.STACK); } /** @@ -172,7 +172,7 @@ public VisualizationAttribute getStack() { */ @JsonIgnore public VisualizationAttribute getView() { - return getAttributeFromCollection(VIEW); + return getAttributeFromCollection(CollectionType.VIEW); } /** @@ -180,7 +180,7 @@ public VisualizationAttribute getView() { */ @JsonIgnore public VisualizationAttribute getSegment() { - return getAttributeFromCollection(SEGMENT); + return getAttributeFromCollection(CollectionType.SEGMENT); } /** @@ -188,7 +188,7 @@ public VisualizationAttribute getSegment() { */ @JsonIgnore public VisualizationAttribute getTrend() { - return getAttributeFromCollection(TREND); + return getAttributeFromCollection(CollectionType.TREND); } /** diff --git a/src/main/java/com/gooddata/md/visualization/VisualizationType.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationType.java similarity index 88% rename from src/main/java/com/gooddata/md/visualization/VisualizationType.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationType.java index c3829b740..34fc1053d 100644 --- a/src/main/java/com/gooddata/md/visualization/VisualizationType.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationType.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2018, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.md.visualization; +package com.gooddata.sdk.model.md.visualization; import org.springframework.util.StringUtils; diff --git a/src/main/java/com/gooddata/notification/Channel.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Channel.java similarity index 90% rename from src/main/java/com/gooddata/notification/Channel.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Channel.java index 9a7b37aec..59f59f645 100644 --- a/src/main/java/com/gooddata/notification/Channel.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Channel.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -13,8 +13,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.account.Account; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.account.Account; +import com.gooddata.sdk.model.md.Meta; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/notification/Configuration.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Configuration.java similarity index 83% rename from src/main/java/com/gooddata/notification/Configuration.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Configuration.java index 3a2473b2a..658cc4684 100644 --- a/src/main/java/com/gooddata/notification/Configuration.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Configuration.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/notification/EmailConfiguration.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/EmailConfiguration.java similarity index 91% rename from src/main/java/com/gooddata/notification/EmailConfiguration.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/EmailConfiguration.java index 387f918df..6fb53bbf6 100644 --- a/src/main/java/com/gooddata/notification/EmailConfiguration.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/EmailConfiguration.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/notification/MessageTemplate.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/MessageTemplate.java similarity index 91% rename from src/main/java/com/gooddata/notification/MessageTemplate.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/MessageTemplate.java index 13755a576..cab621870 100644 --- a/src/main/java/com/gooddata/notification/MessageTemplate.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/MessageTemplate.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/ProjectEvent.java similarity index 96% rename from src/main/java/com/gooddata/notification/ProjectEvent.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/ProjectEvent.java index cc2173a3e..99fea9f04 100644 --- a/src/main/java/com/gooddata/notification/ProjectEvent.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/ProjectEvent.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/notification/Subscription.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Subscription.java similarity index 95% rename from src/main/java/com/gooddata/notification/Subscription.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Subscription.java index c6aeb8b8b..9391eee54 100644 --- a/src/main/java/com/gooddata/notification/Subscription.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Subscription.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static org.apache.commons.lang3.Validate.notEmpty; import static org.apache.commons.lang3.Validate.notNull; @@ -13,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/notification/TimerEvent.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/TimerEvent.java similarity index 91% rename from src/main/java/com/gooddata/notification/TimerEvent.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/TimerEvent.java index 4498ca08c..ef62c0685 100644 --- a/src/main/java/com/gooddata/notification/TimerEvent.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/TimerEvent.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/notification/Trigger.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Trigger.java similarity index 82% rename from src/main/java/com/gooddata/notification/Trigger.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Trigger.java index d575d5850..eed7023ae 100644 --- a/src/main/java/com/gooddata/notification/Trigger.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/Trigger.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/com/gooddata/notification/TriggerCondition.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/TriggerCondition.java similarity index 90% rename from src/main/java/com/gooddata/notification/TriggerCondition.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/TriggerCondition.java index cb83f53db..7e8ba780f 100644 --- a/src/main/java/com/gooddata/notification/TriggerCondition.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/notification/TriggerCondition.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.notification; +package com.gooddata.sdk.model.notification; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/project/CreatedInvitations.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/CreatedInvitations.java similarity index 95% rename from src/main/java/com/gooddata/project/CreatedInvitations.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/CreatedInvitations.java index 0ab708ca5..ac71390e2 100644 --- a/src/main/java/com/gooddata/project/CreatedInvitations.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/CreatedInvitations.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/Environment.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Environment.java similarity index 87% rename from src/main/java/com/gooddata/project/Environment.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Environment.java index d98bd5ce5..2acab64fd 100644 --- a/src/main/java/com/gooddata/project/Environment.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Environment.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; /** * Optional property for project or warehouse create, the property is ignored during update. diff --git a/src/main/java/com/gooddata/project/Invitation.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Invitation.java similarity index 93% rename from src/main/java/com/gooddata/project/Invitation.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Invitation.java index db09ef0e5..77f98171d 100644 --- a/src/main/java/com/gooddata/project/Invitation.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Invitation.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/project/Invitations.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Invitations.java similarity index 73% rename from src/main/java/com/gooddata/project/Invitations.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Invitations.java index 64be0cba1..49f95580a 100644 --- a/src/main/java/com/gooddata/project/Invitations.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Invitations.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; @@ -16,17 +16,17 @@ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class Invitations { +public class Invitations { /** * @see Project#getInvitationsUri() */ - static final String URI = Project.URI + "/invitations"; - static final UriTemplate TEMPLATE = new UriTemplate(URI); + public static final String URI = Project.URI + "/invitations"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); private final List invitations; - Invitations(Invitation... invitations) { + public Invitations(Invitation... invitations) { this.invitations = asList(invitations); } diff --git a/src/main/java/com/gooddata/project/Project.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Project.java similarity index 99% rename from src/main/java/com/gooddata/project/Project.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Project.java index 38afb9c52..bb0889b6f 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Project.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.GDDateTimeDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectDriver.java similarity index 82% rename from src/main/java/com/gooddata/project/ProjectDriver.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectDriver.java index d753f960a..2a9fd4cbb 100644 --- a/src/main/java/com/gooddata/project/ProjectDriver.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectDriver.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/project/ProjectEnvironment.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectEnvironment.java similarity index 80% rename from src/main/java/com/gooddata/project/ProjectEnvironment.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectEnvironment.java index cda79d1dc..9124548fa 100644 --- a/src/main/java/com/gooddata/project/ProjectEnvironment.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectEnvironment.java @@ -1,14 +1,14 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; /** * Optional property for project create, the property is ignored during project update. * Default value is {@link #PRODUCTION} which is also environment for all currently existing projects.

- * Preffer {@link com.gooddata.project.Environment} if possible. + * Preffer {@link Environment} if possible. */ public enum ProjectEnvironment { /** Default value, projects are backed-up and archived. */ diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectTemplate.java similarity index 92% rename from src/main/java/com/gooddata/project/ProjectTemplate.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectTemplate.java index dc316083b..a246e9f67 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplate.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectTemplate.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectTemplates.java similarity index 88% rename from src/main/java/com/gooddata/project/ProjectTemplates.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectTemplates.java index 4ff21115a..fef575aff 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplates.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectTemplates.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -19,7 +19,7 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class ProjectTemplates { +public class ProjectTemplates { private final Collection templatesInfo; diff --git a/src/main/java/com/gooddata/project/ProjectUsersUpdateResult.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectUsersUpdateResult.java similarity index 90% rename from src/main/java/com/gooddata/project/ProjectUsersUpdateResult.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectUsersUpdateResult.java index 44c589cbb..b3c534326 100644 --- a/src/main/java/com/gooddata/project/ProjectUsersUpdateResult.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectUsersUpdateResult.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -21,7 +21,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class ProjectUsersUpdateResult { +public class ProjectUsersUpdateResult { private final List successful; private final List failed; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResult.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResult.java similarity index 96% rename from src/main/java/com/gooddata/project/ProjectValidationResult.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResult.java index 6e7d18b7c..fea341017 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResult.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResult.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultGdcTimeElParam.java similarity index 93% rename from src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultGdcTimeElParam.java index 49ead2703..a7c10a6a4 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultGdcTimeElParam.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -12,7 +12,6 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; -import java.util.Objects; @JsonTypeName("gdctime_el") @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultItem.java similarity index 93% rename from src/main/java/com/gooddata/project/ProjectValidationResultItem.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultItem.java index 551347d4e..e002ba163 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultItem.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultObjectParam.java similarity index 94% rename from src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultObjectParam.java index b1175c619..aa4900f0e 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultObjectParam.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultParam.java similarity index 90% rename from src/main/java/com/gooddata/project/ProjectValidationResultParam.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultParam.java index df2d81aa8..a6ffdb6ff 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultParam.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonSubTypes; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultSliElParam.java similarity index 97% rename from src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultSliElParam.java index 81e382dc9..68ab8bc75 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultSliElParam.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import static java.lang.String.format; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultStringParam.java similarity index 93% rename from src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultStringParam.java index e5b06f3b6..a29ee0b6b 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResultStringParam.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResults.java similarity index 97% rename from src/main/java/com/gooddata/project/ProjectValidationResults.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResults.java index 433ab3147..a660a1aa6 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResults.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationResults.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.gooddata.util.BooleanDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidationType.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationType.java similarity index 94% rename from src/main/java/com/gooddata/project/ProjectValidationType.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationType.java index 9e7e686fb..a9045fff9 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationType.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidationType.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidations.java similarity index 83% rename from src/main/java/com/gooddata/project/ProjectValidations.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidations.java index 7b7aa8a2f..670a92813 100644 --- a/src/main/java/com/gooddata/project/ProjectValidations.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/ProjectValidations.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -22,7 +22,7 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -class ProjectValidations { +public class ProjectValidations { public static final String URI = "/gdc/md/{projectId}/validate"; @@ -33,7 +33,7 @@ class ProjectValidations { } @JsonCreator - ProjectValidations(@JsonProperty("availableValidations") final Set validations) { + public ProjectValidations(@JsonProperty("availableValidations") final Set validations) { this.validations = validations; } diff --git a/src/main/java/com/gooddata/project/Projects.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Projects.java similarity index 90% rename from src/main/java/com/gooddata/project/Projects.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Projects.java index 268b9336f..4a6bb00f8 100644 --- a/src/main/java/com/gooddata/project/Projects.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Projects.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/Role.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Role.java similarity index 95% rename from src/main/java/com/gooddata/project/Role.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Role.java index 99164ed74..f744e8586 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Role.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.md.Meta; +import com.gooddata.sdk.model.md.Meta; import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanStringSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -98,7 +98,7 @@ public String getIdentifier() { *

* NOTE: This is intentionally left package-private. */ - void setUri(final String uri) { + public void setUri(final String uri) { links.put(SELF_LINK, uri); } diff --git a/src/main/java/com/gooddata/project/Roles.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Roles.java similarity index 88% rename from src/main/java/com/gooddata/project/Roles.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Roles.java index 28629dcd1..27217efa9 100644 --- a/src/main/java/com/gooddata/project/Roles.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Roles.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -21,7 +21,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("projectRoles") @JsonIgnoreProperties(ignoreUnknown = true) -class Roles { +public class Roles { public static final String URI = "/gdc/projects/{projectId}/roles"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); @@ -32,7 +32,7 @@ class Roles { this.roles = roles; } - Set getRoles() { + public Set getRoles() { return roles; } diff --git a/src/main/java/com/gooddata/project/User.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/User.java similarity index 96% rename from src/main/java/com/gooddata/project/User.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/User.java index 9b028659a..5552fc492 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/User.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.gooddata.account.Account; +import com.gooddata.sdk.model.account.Account; import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; @@ -45,7 +45,7 @@ public class User { this.links = links; } - User(final Account account, + public User(final Account account, final Role... userRoles) { final List userRoleUris = Arrays.asList(userRoles).stream().map(e -> e.getUri()).collect(Collectors.toList()); diff --git a/src/main/java/com/gooddata/project/Users.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Users.java similarity index 87% rename from src/main/java/com/gooddata/project/Users.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Users.java index cb308cb82..06dd3dd8e 100644 --- a/src/main/java/com/gooddata/project/Users.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/Users.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import static java.util.Arrays.asList; @@ -27,7 +27,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) @JsonDeserialize(using = UsersDeserializer.class) @JsonSerialize(using = UsersSerializer.class) -class Users extends PageableList { +public class Users extends PageableList { public static final String URI = "/gdc/projects/{projectId}/users"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); @@ -37,7 +37,7 @@ class Users extends PageableList { super(items, paging); } - Users(final User... users) { + public Users(final User... users) { this(asList(users), null); } } diff --git a/src/main/java/com/gooddata/project/UsersDeserializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/UsersDeserializer.java similarity index 85% rename from src/main/java/com/gooddata/project/UsersDeserializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/UsersDeserializer.java index 3dce8ba45..149e0e5e4 100644 --- a/src/main/java/com/gooddata/project/UsersDeserializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/UsersDeserializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.gooddata.collections.PageableListDeserializer; import com.gooddata.collections.Paging; diff --git a/src/main/java/com/gooddata/project/UsersSerializer.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/UsersSerializer.java similarity index 90% rename from src/main/java/com/gooddata/project/UsersSerializer.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/UsersSerializer.java index cde681587..b138ab1d2 100644 --- a/src/main/java/com/gooddata/project/UsersSerializer.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/UsersSerializer.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.project; +package com.gooddata.sdk.model.project; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/DiffRequest.java similarity index 93% rename from src/main/java/com/gooddata/model/DiffRequest.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/DiffRequest.java index 0a87125f0..3789c29f0 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/DiffRequest.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.model; +package com.gooddata.sdk.model.project.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/model/MaqlDdl.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/MaqlDdl.java similarity index 63% rename from src/main/java/com/gooddata/model/MaqlDdl.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/MaqlDdl.java index bce30b01d..3fa91618e 100644 --- a/src/main/java/com/gooddata/model/MaqlDdl.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/MaqlDdl.java @@ -1,17 +1,17 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.model; +package com.gooddata.sdk.model.project.model; -import com.gooddata.gdc.AbstractMaql; +import com.gooddata.sdk.model.gdc.AbstractMaql; /** * MAQL DDL statement. * Serialization only. */ -class MaqlDdl extends AbstractMaql { +public class MaqlDdl extends AbstractMaql { public static final String URI = "/gdc/md/{project}/ldm/manage2"; diff --git a/src/main/java/com/gooddata/model/MaqlDdlLinks.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/MaqlDdlLinks.java similarity index 88% rename from src/main/java/com/gooddata/model/MaqlDdlLinks.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/MaqlDdlLinks.java index a1fe493c4..74e8406d0 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlLinks.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/MaqlDdlLinks.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.model; +package com.gooddata.sdk.model.project.model; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.gdc.LinkEntries; +import com.gooddata.sdk.model.gdc.LinkEntries; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -19,6 +19,7 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) +public class MaqlDdlLinks extends LinkEntries { private static final String TASKS_STATUS = "tasks-status"; diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/ModelDiff.java similarity index 97% rename from src/main/java/com/gooddata/model/ModelDiff.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/ModelDiff.java index 79e17c7ca..c1c857ec5 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/project/model/ModelDiff.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.model; +package com.gooddata.sdk.model.project.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -113,7 +113,7 @@ public String toString() { @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("updateScript") @JsonIgnoreProperties(ignoreUnknown = true) - static class UpdateScript { + public static class UpdateScript { private final List maqlChunks; private final Boolean preserveData; diff --git a/src/main/java/com/gooddata/projecttemplate/Template.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/projecttemplate/Template.java similarity index 97% rename from src/main/java/com/gooddata/projecttemplate/Template.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/projecttemplate/Template.java index e0ed00164..8795144d8 100644 --- a/src/main/java/com/gooddata/projecttemplate/Template.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/projecttemplate/Template.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.projecttemplate; +package com.gooddata.sdk.model.projecttemplate; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/projecttemplate/Templates.java b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/projecttemplate/Templates.java similarity index 74% rename from src/main/java/com/gooddata/projecttemplate/Templates.java rename to gooddata-java-model/src/main/java/com/gooddata/sdk/model/projecttemplate/Templates.java index 28991b8e2..a50e9197e 100644 --- a/src/main/java/com/gooddata/projecttemplate/Templates.java +++ b/gooddata-java-model/src/main/java/com/gooddata/sdk/model/projecttemplate/Templates.java @@ -1,9 +1,9 @@ /* - * Copyright (C) 2004-2017, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2004-2019, GoodData(R) Corporation. All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE.txt file in the root directory of this source tree. */ -package com.gooddata.projecttemplate; +package com.gooddata.sdk.model.projecttemplate; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -16,9 +16,9 @@ * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) -class Templates { +public class Templates { - static final String URI = "/projectTemplates"; + public static final String URI = "/projectTemplates"; private final List